组合AndAlso参数'foo'未绑定在指定的LINQ to Entities查询表达式中

时间:2014-09-15 06:48:39

标签: c# linq entity-framework linq-expressions

我有一个实体。

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
}

请赐教。

1 个答案:

答案 0 :(得分:3)

问题是LINQ表达式中的ParameterExpression由引用相等性标识,但两个Parameter对象是不同的引用。 (name中的ParameterExpression仅用于调试目的。)

(如果你重读了上面提到的帖子,它说你尝试的方法只有在同一个ParameterExpression对象上定义了两个lambda时才有效。)

在此阶段,您有两个很大的可能性:要么为Condition函数定义一种接受ParameterExpression对象的方式,要么创建一个将替换原始ExpressionVisitor的{​​{1}} {1}}与另一个人。 (当然,考虑到你想要做ParameterExpression,你也可以想象地链接两个AndAlso条款,但这不太通用。)