Способ сделать это, например, определить некоторый тип для критериев поиска:
public class PeopleSearchCriteria
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string City { get; set; }
}
и определить пользовательский метод расширения для IQueryable<Person>
:
public static IQueryable<Person> FilterBySearchCriteria(this IQueryable<Person> query,
PeoplseSearchCritera criteria)
{
if (!String.IsNullOrEmpty(criteria.FirstName))
{
string firstName = criteria.FirstName;
query = query.Where(p => p.FirstName == firstName);
}
// do similar code for other criterias
return query;
}
Теперь вам нужно всего лишь создать подшивку модели (или, по возможности, использовать привязку по умолчанию), чтобы заполнить параметры поиска в экземпляре PeopleSearchCriteria
и выполнить просто:
var data = context.People.FilterBySearchCriteria(searchCriteria).ToList();
Если вам действительно нужен какой-то динамический подход, вы можете построить дерево выражений вручную или проверить Dynamic Linq (вы потеряете проверки времени компиляции).