我正在使用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 参数来自何处?它是如何产生的?为什么我的情况有问题?
是否有某种表达树可视化器可以帮助我实际看到结果表达式出了什么问题?因为表达的身体很难阅读。
答案 0 :(得分:4)
最后,我找到了一种避免将多个谓词组合到主表达式树的方法。
鉴于每个谓词代表不同的过滤器,并且我希望最终的组合过滤器是一系列必须被尊重的条件,我们可以说每个谓词都必须返回< strong> 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
组合在一起。这正是我想要做的。
这比自己破解表达树更容易。