【问题标题】:Composing Expression<Func<T, bool>> predicates组合 Expression<Func<T, bool>> 谓词
【发布时间】:2013-03-09 07:10:27
【问题描述】:

我有一个方法返回一个

Expression<Func<T, bool>> 

当我在 EF 的 where 子句中使用它作为谓词时,它工作正常,直到我尝试使用 Expression.Or() 向谓词添加更多项目时,我遇到了以下异常:

参数“xxx”未绑定在指定的 LINQ to Entities 查询表达式中。

有没有办法解决这个问题?究竟是什么原因造成的?

已解决

使用http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx

【问题讨论】:

    标签: c# entity-framework lambda extension-methods iqueryable


    【解决方案1】:

    在 EF 中,如果你调用

    IQueryable<T> query = ...
    query.Where( predicate 1 ).Where( predicate 2 )...
    

    然后 EF 将使用 AND 加入 where 子句

    在 EF 中执行 OR 的唯一方法是将谓词放在对 IQueryable.Where 的单个调用中

    IQueryable<T> query = ...
    query.Where( predicate 1 || predicate 2 )...
    

    【讨论】:

      【解决方案2】:

      要撰写或喜欢 AND,您可以使用 PredicateBuilder

      【讨论】:

        【解决方案3】:

        要在 OR 关系中组合谓词,您可以:

        predicate = Expression.Lambda<Func<T, bool>>(Expression.Or(predicate.Body, newPredicate.Body), newPredicate.Parameters);
        

        【讨论】:

        • 刚刚检查了您的解决方案链接,我建议的内容与该解决方案相同,只是没有 ParameterRebinder 功能。
        • 如果两个谓词具有相同的参数,我的解决方案就有效。即谓词 = p => p.Age >= 18; newPredicate = p => p.Gender = Gender.Male; predicate = Expression.Lambda>(Expression.Or(predicate.Body, newPredicate.Body), newPredicate.Parameters);
        猜你喜欢
        • 2021-06-17
        • 1970-01-01
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        相关资源
        最近更新 更多