嵌套PredicateBuilder谓词:'参数'f'未绑定在指定的LINQ to Entities查询表达式中'

8 c# linq-to-entities linqkit

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

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

参数"f"未绑定在指定的LINQ to Entities查询表达式中

我首先想到内部谓词在与主谓词组合之前必须进行扩展,所以我改变了我的组合代码来添加对内部谓词Expand方法的调用,如下所示:

mainPredicate = mainPredicate.And(innerPredicate.Expand());
Run Code Online (Sandbox Code Playgroud)

但我得到完全相同的例外.

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

  • 我的代码出了什么问题?

  • 我怎么能实际调试这个?

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

  • 是否有某种表达树可视化器可以帮助我实际看到结果表达式出了什么问题?因为表达的身体很难阅读.

小智 4

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

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

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

predicate1 AND predicate2 AND predicate3...

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

var documents = this.ObjectSet.AsExpandable()
    .Where(mainPredicate)
    .Where(otherPredicate)
    .Where(yetAnotherPredicate)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

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

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