动态LINQ表达式

时间:2014-05-21 15:35:39

标签: c# linq

我试图实现此How to specify dynamic field names in a Linq where clause?并收到编译错误:

  

无法解析方法'其中(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<Employee>
{
    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<Employee, bool>>(
    Expression.GreaterThan(
        Expression.Property(eParam, "Salary"),
        Expression.Constant(40000)),
    eParam).Compile();

查询也可以用

等方法语法编写
var b = employees.Where(comparison);

您可以在员工.Compile()之前致电.AsQueryable(),而不是致电.Where()

1 个答案:

答案 0 :(得分:5)

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

    var comparison = Expression.Lambda<Func<Employee, bool>>(... 
    
  2. 来源必须是IQueryable。在调用Where。

  3. 之前,请在列表中拨打AsQueryable()