All of the above work fine but it depends on what you want to achieve.
If you need to set a permanent filter use addTableFilterParam, once the filter is in place it will be used everywhere (it will be appended to ANY query sent to the DB), every foundset created after the filter setup will be filtered.
If you need to apply a filter but just for the current foundset use addFoundSetFilterParam, any future search on that foundset will go trough the filter.
If you use loadRecords(query,args) keep in mind that any future search on that foundset will not honor the intial where condition (ex: if the user, after the intial load, searches all contacts starting with “A” he will also find contacts with type_id != 2).
As a side note: if you use loadRecords use the following syntax to take advantage of the prepared statements (faster and easier to read):
foundset.loadRecords('SELECT contact.contact_id FROM contact WHERE type_id = ?',[2]);