加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用foreach循环构建自定义谓词以充当过滤器

发布时间:2020-12-15 05:39:29 所属栏目:百科 来源:网络整理
导读:我需要通过将文档列表传递给我正在努力使用foreach循环动态构建的自定义过滤器来过滤文档列表: var mainPredicate = PredicateBuilder.TrueDocument();// mainPredicate is combined to other filters successfully here ...var innerPredicate = Predicate
我需要通过将文档列表传递给我正在努力使用foreach循环动态构建的自定义过滤器来过滤文档列表:
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’参数丢失了.我不知道为什么缺少这个工作.我的代码与许多其他完美运行的示例相同.任何关于调用表达式的理论理论信息及其在幕后的工作方式都是值得欢迎的.

解决方法

我不明白你为什么这样做:
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...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读