Если Вы создаете Объект фильтра, который содержит критерии Linq, который обычно входит где пункт как это:
var myFilterObject = FilterFactory.GetBlank();
myFilterObject.AddCondition("Salary", "lessThan", "40000");
var myResult = myRepository.GetEmployees(myFilterObject);
Как Вы соответствовали бы полю Linq к Имени поля, не используя большой оператор выбора?
return from e in db.Employee
where e.Salary < 40000
select new IList<EmployeeViewModel> { Name= e.name, Salary= e.Salary };
Я предполагаю, что необходимо отправить объект в Репозиторий, который указывает фильтрацию так, чтобы Вы только вытянули то, что записывает Вас потребность. Я предполагаю, что Linq не предварительно компилирует (если Вы не создаете специализированного делегата и функцию), таким образом, необходимо смочь динамично указать, какие поля Вы хотите отфильтровать.
Было бы хорошо, если Вы могли бы сделать что-то как e ["Зарплата"] как некоторый тип Объекта Expando.
Предлагаю вам взглянуть на Dynamic Query в примерах Linq to SQL. Вы можете использовать это для записи условий в "обычном тексте", например:
var employees = db.Employee.Where("Salary < 40000").Select(...);
Чтобы уточнить: эти расширения, по сути, строят те же деревья выражений из строки, которую вы обычно создаете с помощью лямбда-выражений, так что это не то же самое, что писать необработанные SQL против базы данных. Единственным недостатком является то, что вы не можете использовать с ним синтаксис понимания запроса ( из x в y
и т. Д.).
Вы можете построить Выражение вручную, например:
var eParam = Expression.Parameter(typeof(Employee), "e");
var comparison = Expression.Lambda(
Expression.LessThan(
Expression.Property(eParam, "Salary"),
Expression.Constant(40000)),
eParam);
return from e in db.Employee.Where(comparison)
select new EmployeeViewModel { Name = e.name, Salary = e.Salary };