Есть несколько способов сделать это, я использовал сочетание критериев API и объектов запросов.
Например, если у вас есть коллекция Persons, которую вы хотите запросить:
1) API критериев более гибкого пути: GetPerson (запрос IList)
public class Criteria
{
Object Property; // (Domain property, not DB)// (String Or Lambda) Age, Father.Age, Friends, etc
Object Operator; //(Enum or String)(Eq, Gr, Between,Contains, StartWith, Whatever...)
Object Value; // (most likely Object, or use generics Criteria<T>), (Guid, int[], Person, any type).
}
2) Сильно описанный объект запроса:
public class PersonQuery
{
Guid? Id;
GenderEnum? Gender;
Int32? Age;
Int32? AgeMin;
Int32? AgeMax;
String Name;
String NameContains;
Person FatherIs;
Person MotherIs;
//...
}
Используйте Nullable <> для типов значений и присвойте Null, чтобы указать, что параметр не требуется.
Каждый метод имеет положительные и отрицательные стороны.