组合AndAlso参数';foo';未绑定到指定的LINQ to Entities查询表达式中
本文关键字:Entities to LINQ 查询 查询表 表达式 foo 参数 AndAlso 绑定 组合 | 更新日期: 2023-09-27 18:22:02
我有一个实体。
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public string Code { get; set; }
}
我想创建自己的表达式谓词。为此,我创建了一个接受属性名称和值的方法。
private static Expression<Func<Foo, bool>> Condition(string pName, object value)
{
var pe = Expression.Parameter(typeof(Foo), "foo");
var left = Expression.Property(pe, pName);
var right = Expression.Constant(value);
var equal = Expression.Equal(left, right);
var predicate = Expression.Lambda<Func<Foo, bool>>(equal, pe);
return predicate;
}
这是适用于单个条件的谓词。
using (var db = new MyEntities())
{
var predicate = Condition("Name", "foo");
var foos = db.Foos.Where(predicate).ToArray();
}
但当我试图通过关注这篇文章来结合这两个条件时,它抛出了一个异常。
参数"foo"未绑定在指定的LINQ to Entities中查询表达式。
using (var db = new MyEntities())
{
var cond1 = Condition("Name", "foo");
var cond2 = Condition("Code", "bar");
var body = Expression.AndAlso(cond1.Body, cond2.Body);
var predicate = Expression.Lambda<Func<Foo,bool>>(body, cond1.Parameters[0]);
var foos = db.Foos.Where(predicate).ToArray(); // exception
}
请启发我。
问题是LINQ表达式中的ParameterExpression
是通过引用相等来标识的,但两个Parameter
对象是不同的引用。(ParameterExpression
中的name
仅用于调试目的)。
(如果你重读上面提到的帖子,它说只有当两个lambda都定义在同一个ParameterExpression
对象上时,你尝试的方法才会起作用)。
在这个阶段,您有两种很大的可能性:要么为Condition
函数定义一种接受ParameterExpression
对象的方式,要么创建一个ExpressionVisitor
,用另一个对象替换原来的ParameterExpression
。(当然,如果你想做一个AndAlso
,你也可以想象链接两个Where
子句,但这不太通用。)