动态LINQ表达式

reg*_*tar 2 c# 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:

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

var comparison = Expression.Lambda<Func<Employee, bool>>(
    Expression.GreaterThan(
        Expression.Property(eParam, "Salary"),
        Expression.Constant(40000)),
    eParam).Compile();
Run Code Online (Sandbox Code Playgroud)

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

var b = employees.Where(comparison);
Run Code Online (Sandbox Code Playgroud)

而不是调用的.Compile(),可调用.AsQueryable().Where()员工也.

Mar*_*zek 5

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

    var comparison = Expression.Lambda<Func<Employee, bool>>(... 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 来源必须是IQueryable.打电话AsQueryable()叫凡在你的名单上.

  • @reggaeguitar为了显式提供`Expression`参数,必须使用方法语法编写查询*.它不可能做任何其他事情.所以,是的,可以使用方法语法,这正是您在查询中使用的`Where`运算符. (2认同)