我正在使用 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();
我正在组合我的两个谓词,就像文档中解释的那样。但是,我得到这个异常(exception):
The parameter 'f' was not bound in the specified LINQ to Entities query expression
我首先想到的是在将内部谓词与主谓词组合之前必须对其进行扩展,因此我更改了组合代码以添加对内部谓词的 Expand
方法的调用,如下所示:
mainPredicate = mainPredicate.And(innerPredicate.Expand());
但我得到了完全相同的异常。
我的代码与文档的唯一区别是我使用foreach
循环 动态构建我的嵌套谓词。我只是不知道它如何对结果表达式产生负面影响。
我的代码有什么问题?
我该如何实际调试它?
f 参数从何而来?它是如何产生的?为什么我的情况有问题?
是否有某种表达式树可视化工具可以帮助我真正了解生成的表达式有什么问题?因为表达式的正文很难阅读。
最佳答案
最后,我找到了一种避免将多个谓词组合到主表达式树的方法。
假设每个谓词代表一个不同的过滤器,我希望最终的组合过滤器是一系列必须遵守的条件,我们可以说每个谓词都必须返回 < 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
结合起来。这正是我想做的。
这比自己破解表达式树更容易。
关于c# - 嵌套 PredicateBuilder 谓词 : 'The parameter ' f' was not bound in the specified LINQ to Entities query expression',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16462692/