我有一个实体。
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();
}
但是当我尝试通过跟随this post来组合两个条件时,它会抛出异常。
参数&#39; foo&#39;未绑定在指定的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
}
请赐教。
答案 0 :(得分:3)
问题是LINQ表达式中的ParameterExpression
由引用相等性标识,但两个Parameter
对象是不同的引用。 (name
中的ParameterExpression
仅用于调试目的。)
(如果你重读了上面提到的帖子,它说你尝试的方法只有在同一个ParameterExpression
对象上定义了两个lambda时才有效。)
在此阶段,您有两个很大的可能性:要么为Condition
函数定义一种接受ParameterExpression
对象的方式,要么创建一个将替换原始ExpressionVisitor
的{{1}} {1}}与另一个人。 (当然,考虑到你想要做ParameterExpression
,你也可以想象地链接两个AndAlso
条款,但这不太通用。)