var mainPredicate = PredicateBuilder.True<document>();// mainPredicate is combined to other filters successfully here ...var innerPredicate = PredicateBuilder.False<document>();foreach (var period in periods){ var p = period; Expression<Func<document,bool>> inPeriod = d => d.Date >= p.DateFrom && d.Date <= p.Dateto; innerPredicate = innerPredicate.Or(d => inPeriod.Invoke(d));}mainPredicate = mainPredicate.And(innerPredicate);
最后一行:
documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList();
引发此异常:
The parameter ‘d’ was not bound in the specifIEd liNQ to EntitIEs
query Expression.
任何人都知道为什么我得到这个例外?我不明白我传递给InPeriod方法的’d’参数丢失了.我不知道为什么缺少这个工作.我的代码与许多其他完美运行的示例相同.任何关于调用表达式的理论理论信息及其在幕后的工作方式都是值得欢迎的.
@H_502_19@解决方法 我不明白你为什么这样做:innerPredicate = innerPredicate.Or(d => inPeriod.Invoke(d));
当你可以完全避免调用时,像这样:
innerPredicate = innerPredicate.Or(inPeriod);
这应该完全正常.
顺便说一句,我觉得这里有liNQKit的错误(除非有一些文档暗示它不支持这种情况).
当我尝试这个类似的代码:
Expression<Func<int,bool>> first = p1 => p1 > 4; Expression<Func<int,bool>> second = p2 => p2 < 2;// Expand is similar to AsExpandable,except it works on // Expressions,not queryables.var composite = first.Or(d => second.Invoke(d)) .Expand();
… liNQKit生成以下复合表达式:
p1 => ((p1 > 4) OrElse (d < 2)) // what on earth is d?
…确实有未绑定的参数d(NodeType = Parameter,name =’d’).
首先躲避调用.或者(第二个).Expand()生成完全合理的:
p1 => ((p1 > 4) OrElse (p1 < 2)) // much better Now...@H_502_19@ @H_502_19@ 总结
以上是内存溢出为你收集整理的c# – 使用foreach循环构建自定义谓词以充当过滤器全部内容,希望文章能够帮你解决c# – 使用foreach循环构建自定义谓词以充当过滤器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)