如何在Linq where子句中指定动态字段名称?

Zac*_*ott 6 c# linq where-clause

如果您创建一个Filter对象,其中包含Linq的条件,通常在where子句中,如下所示:

 var myFilterObject = FilterFactory.GetBlank();
 myFilterObject.AddCondition("Salary", "lessThan", "40000");

 var myResult = myRepository.GetEmployees(myFilterObject);
Run Code Online (Sandbox Code Playgroud)

如何在不使用大案例陈述的情况下将Linq字段与字段名称匹配?

 return from e in db.Employee
        where e.Salary < 40000
        select new IList<EmployeeViewModel> { Name= e.name, Salary= e.Salary };
Run Code Online (Sandbox Code Playgroud)

我假设您需要将一个对象发送到指定过滤的存储库,以便您只提取所需的记录.我假设Linq没有预编译(除非您创建自定义委托和函数),因此您应该能够动态指定要筛选的字段.

如果你可以像某些类型的Expando对象那样做e ["Salary"]这样的话会很好.

小智 10

您可以手动构建表达式,如下所示:

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 };
Run Code Online (Sandbox Code Playgroud)


Aar*_*ght 9

我建议您查看Linq to SQL示例中的Dynamic Query.您可以使用它以"纯文本"编写条件,例如:

var employees = db.Employee.Where("Salary < 40000").Select(...);
Run Code Online (Sandbox Code Playgroud)

澄清一下:这些扩展本质上是通过lambdas构造的字符串构建相同的表达式树,因此这与在数据库中编写原始SQL不同.唯一的缺点是你不能使用查询理解语法(from x in y等).