【发布时间】: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,您可能还必须在
innerPredicate的Or中使用Expand() -
我试过了。我得到了同样的例外。
标签: c# linq-to-entities linqkit