【发布时间】: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.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(),还可以在.Where() 之前对员工调用.AsQueryable()。
【问题讨论】: