我正在尝试实现此方法。如何在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<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.Linq
和System.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()
员工也。
您的表达式必须使用强类型:
var comparison = Expression.Lambda<Func<Employee, bool>>(...
来源必须是IQueryable
。致电AsQueryable()
清单之前,先致电清单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句