I don't which is more efficient, but if you want to join and filter on the joined table, then you should add a Relation (Join), and a PredicateExpression (Filter)
For Adapter:
FetchTypedList() accepts a RelationPredicateBucket object in one of its overloads, in which you can find the Relations collection and the PredicateExpression object.
For SelfServicing:
Use GetMultiAsDataTable() as follows:
MyTypedList myTL = new MyTypedList();
IRelationCollection relations = myTL.BuildRelationSet();
relations.Add(/*the needed relation*/);
TypedListDAO dao = DAOFactory.CreateTypedListDAO();
dao.GetMultiAsDataTable(myTL.BuildResultset(), myTL, 0, null, /*needed filter*/, relations, false, null, null, 0, 0);