组合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
}

请启发我。

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

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

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

在这个阶段,您有两种很大的可能性:要么为Condition函数定义一种接受ParameterExpression对象的方式,要么创建一个ExpressionVisitor,用另一个对象替换原来的ParameterExpression。(当然,如果你想做一个AndAlso,你也可以想象链接两个Where子句,但这不太通用。)