我正在尝试实现这个如何在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.Linq和System.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()员工也.
你的表达必须是强类型的:
var comparison = Expression.Lambda<Func<Employee, bool>>(...
Run Code Online (Sandbox Code Playgroud)来源必须是IQueryable.打电话AsQueryable()叫凡在你的名单上.
| 归档时间: |
|
| 查看次数: |
3017 次 |
| 最近记录: |