Как указать динамические имена полей в Linq где пункт?

Если Вы создаете Объект фильтра, который содержит критерии 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.

6
задан Zachary Scott 23 March 2010 в 02:56
поделиться

2 ответа

Предлагаю вам взглянуть на Dynamic Query в примерах Linq to SQL. Вы можете использовать это для записи условий в "обычном тексте", например:

var employees = db.Employee.Where("Salary < 40000").Select(...);

Чтобы уточнить: эти расширения, по сути, строят те же деревья выражений из строки, которую вы обычно создаете с помощью лямбда-выражений, так что это не то же самое, что писать необработанные SQL против базы данных. Единственным недостатком является то, что вы не можете использовать с ним синтаксис понимания запроса ( из x в y и т. Д.).

9
ответ дан 8 December 2019 в 05:54
поделиться

Вы можете построить Выражение вручную, например:

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 };
10
ответ дан 8 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: