动态LINQ表达式

我正在尝试实现这个如何在Linq where子句中指定动态字段名称? 并得到一个编译器错误,说:

无法解析方法’Where(System.Linq.Expressions.LambdaExpression

public class Employee { public string Name { get; private set; } public int Salary { get; private set; } public Employee(string name, int salary) { Name = name; Salary = salary; } } 

然后在控制台应用程序的主要方法

 var employees = new List { new Employee("Bob", 45000), new Employee("Jane", 25000), new Employee("Jim", 5) }; var eParam = Expression.Parameter(typeof(Employee), "e"); var comparison = Expression.Lambda( Expression.LessThan( Expression.Property(eParam, "Salary"), Expression.Constant(40000)), eParam); var c = from e in employees.Where(comparison) // COMPILER ERROR HERE!!! select new {e.Name, e.Salary}; 

我正在使用System.LinqSystem.Linq.Expressions 。 我在这做错了什么?

编辑:

答案是强烈键入比较变量并在其上调用Compile

 var comparison = Expression.Lambda<Func>( Expression.GreaterThan( Expression.Property(eParam, "Salary"), Expression.Constant(40000)), eParam).Compile(); 

查询也可以用方法语法编写

 var b = employees.Where(comparison); 

可以在员工的.Where()之前调用.Compile() ,而不是调用.Compile()

  1. 你的表达必须是强类型的:

     var comparison = Expression.Lambda>(... 
  2. 来源必须是IQueryable 。 在调用Where之前,在列表上调用AsQueryable()