【问题标题】:Expression.Lambda does not bind IEnumerable<ParameterExpressions>Expression.Lambda 不绑定 IEnumerable<ParameterExpressions>
【发布时间】:2021-03-25 23:45:25
【问题描述】:

我有一个这样的表达式>:

Expression<Func<T,bool>> filterExp = input => input.Deleted == false;

然后,我有一个计算另一个 Expression> 的逻辑:

Expression<Func<T,bool>> standardExp = input => 1 == 1;
if (onlyStandard) {
    standardExp = input =>input.Standard == true;
}

我知道在这个例子中,我可以把这个逻辑放在 filterExp 表达式中,但是在我的代码中,standardExp 被一个类型为 T 的字典作为键,所以我不能把逻辑放在 filterExp 或者 LinqToSQL 无法翻译它在 SQL 表达式中。 我正在尝试以这种方式合并这些表达式:

BinaryExpression exp = Expression.AndAlso(filterExp.Body, standardExp.Body);

然后,我使用以下语句创建 ParameterExpression:

var p = Expression.Parameter(typeof(T),"input");

我用这个创建 Lambda:

var lmb = Expression.Lambda<Func<T, bool>>(exp,new ParameterExpression[] { p });

但是,当我尝试这样做时:

var result = db.Entities.Where(lmb);

我有一个异常告诉我输入参数没有绑定。 “参数 'input' 未绑定在指定的 LINQ to Entities 查询表达式中。” 当然,在通用场景中,T 是用“实体”类型解析的。 我是表达式树的新手,我还没有找到任何关于参数绑定的文档。我究竟做错了什么?请再次注意,最终的 lambda 应该与实体框架一起使用,并且应该可以转换为 SQL。谢谢。

【问题讨论】:

    标签: c# lambda expression


    【解决方案1】:

    在这里找到回复:

    Combining two expressions (Expression<Func<T, bool>>)

    所以基本上,我在这里做错了:

    BinaryExpression exp = Expression.AndAlso(filterExp.Body, standardExp.Body);
    

    因为我必须调用这些表达式...但是调用方法不是 EF-Save,除非您为 EF 合规性执行 ExpressionVisitor,就像上面的链接中所示。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 2011-08-16
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多