【问题标题】:Combining AndAlso The parameter 'foo' was not bound in the specified LINQ to Entities query expression组合 AndAlso 参数 'foo' 未绑定在指定的 LINQ to Entities 查询表达式中
【发布时间】:2014-09-15 06:48:39
【问题描述】:

我有一个实体。

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 组合两个条件时,它会抛出异常。

参数“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
}

请赐教。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,所以你是建议把表达式参数取出来作为方法参数?我现在就试试。
    • @tsuta:这是一种方法。另一种方法是用一个对象封装 lambda 表达式构建过程,该对象每次都将重用相同的参数对象。使用ExpressionVisitor 更复杂,但如果您不控制创建的Expression 对象,这将是主要的方法。
    • 谢谢你的解释,我还在学习表达式,很感兴趣它是如何构建谓词的,我稍后会尝试使用表达式访问者,但现在它满足了我的要求,因为我有完整的控制自己的表情。
    猜你喜欢
    • 1970-01-01
    • 2014-10-19
    • 2019-05-16
    • 1970-01-01
    • 2020-06-11
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多