【问题标题】:Nesting PredicateBuilder predicates : 'The parameter 'f' was not bound in the specified LINQ to Entities query expression'嵌套 PredicateBuilder 谓词:'参数'f'未绑定在指定的 LINQ to Entities 查询表达式中'
【发布时间】:2013-05-16 04:15:00
【问题描述】:

我正在使用 LinqKit 的 PrediateBuilder 类构建谓词来动态设置过滤器,我想将嵌套的一个组合到另一个

我已阅读此内容 (http://www.albahari.com/nutshell/predicatebuilder.aspx):

这是我的代码:

// The main predicate.
var mainPredicate = PredicateBuilder.True<Document>();

// ... some other conditions to the main predicate here ...

// The inner predicate (combined conditions using OR).
var innerPredicate = PredicateBuilder.False<Document>();

foreach (var period in periods)
{
    var p = period;
    innerPredicate =
        innerPredicate.Or(
            d =>
            (d.Date >= p.DateFrom && d.Date <= p.DateTo));
}

mainPredicate = mainPredicate.And(innerPredicate);

documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList();

我正在组合我的两个谓词,就像文档中解释的那样。但是,我得到了这个例外:

参数“f”未绑定到指定的 LINQ to Entities 查询表达式

我首先认为在将内部谓词与主谓词组合之前必须对其进行扩展,因此我更改了组合代码以添加对内部谓词的Expand方法的调用,如下所示:

mainPredicate = mainPredicate.And(innerPredicate.Expand());

但我得到了完全相同的异常。

我的代码与文档的唯一区别是我使用foreach 循环动态构建嵌套谓词。我只是不知道它如何对结果表达式产生负面影响。

  • 我的代码有什么问题?

  • 我怎样才能真正调试这个?

  • f 参数从何而来?它是如何产生的?为什么我的情况有问题?

  • 是否有某种表达式树可视化工具可以帮助我真正了解生成的表达式有什么问题?因为表达式的主体很难阅读。

【问题讨论】:

  • 查看this question,您可能还必须在innerPredicateOr 中使用Expand()
  • 我试过了。我得到了同样的例外。

标签: c# linq-to-entities linqkit


【解决方案1】:

最后,我找到了一种避免将多个谓词组合到主表达式树的方法。

鉴于每个谓词代表一个不同的过滤器,并且我希望最终的组合过滤器是一系列必须遵守条件,我们可以说每个谓词都必须返回 true 让最终谓词返回 true。

为此,谓词必须与 AND 结合使用。因此,生成的 SQL 查询必须如下所示:

predicate1 AND predicate2 AND predicate3 ...

将这些谓词与AND 结合的更好方法是将Where 查询运算符链接到最终查询,如下所示:

var documents = this.ObjectSet.AsExpandable()
    .Where(mainPredicate)
    .Where(otherPredicate)
    .Where(yetAnotherPredicate)
    .ToList();

生成的 SQL 查询会将这些谓词中的每一个与AND 结合起来。这正是我想做的。

这比我自己破解表达式树要容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多