【问题标题】:Dynamic LINQ Expression动态 LINQ 表达式
【发布时间】:2014-05-21 15:35:38
【问题描述】:

我正在尝试实现这个 How to specify dynamic field names in a Linq where clause? 并得到一个编译器错误,上面写着:

无法解析方法 '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;
    }
}

然后在控制台应用的 main 方法中

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(),还可以在.Where() 之前对员工调用.AsQueryable()

【问题讨论】:

    标签: c# linq


    【解决方案1】:
    1. 你的表达式必须是强类型的:

      var comparison = Expression.Lambda<Func<Employee, bool>>(... 
      
    2. 来源必须是IQueryable。在致电 Where 之前,请致电您名单上的 AsQueryable()

    【讨论】:

    • 这只是投射结果。演员表不是静态类型,这都是动态类型。但是演员你想要做的。
    • 是否可以用方法语法进行查询?
    • @reggaeguitar 要显式提供Expression 参数,查询必须使用方法语法编写。不可能做任何其他事情。所以是的,可以使用方法语法,这正是您在查询中用于应用 Where 运算符的语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多