PredicateBuilder <true>和PredicateBuilder之间的区别<false>?</false> </true>

时间:2013-05-22 15:15:18

标签: c# entity-framework linq predicatebuilder linqkit

我有代码:

   var predicate = PredicateBuilder.True<Value>();

predicate = predicate.And(x => x.value1 == "1");
predicate = predicate.And(x => x.value2 == "2");

var vals = Value.AsExpandable().Where(predicate).ToList();

如果我有PredicateBuilder.True<Value>(),它会带回我的期望,但如果我有PredicateBuilder.False<Value>(),它会带回0条记录。有人可以解释这是什么区别,为什么在一个场景中我得到0记录在另一个我得到我期望的。我已经阅读了PredicateBuilder文档,但有点令人困惑。我觉得这与我Anding一起谓词的事实有关吗?

2 个答案:

答案 0 :(得分:4)

当使用PredicateBuilder逐步构建0或更多条件的谓词时,可以方便地使用&#34;中性&#34;可以添加的谓词,因为您可以遍历这些条件,并将andor与最后一个一起进行迭代。 E.g。

var predicate = PredicateBuilder.True<Value>();

foreach (var item in itemsToInclude) {
  predicate = predicate.And(o => o.Items.Contains(item));
}

这相当于更简单的布尔逻辑:

var predicate = true;

foreach (var item in itemsToInclude) {
  predicate = predicate && o.Items.Contains(item);
}

这相当于

true && ((o.Items.Contains(itemsToInclude[0] && o.Items.Contains.itemsToInclude[1]) ...)

true && restOfPredicate,如果true为真,则评估为restOfPredicate;如果falserestOfPredicate则评估为false。因此,为什么它被认为是中立的。

PredicateBuilder.False开始,将等同于false && restOfPredicate,其总是评估为false

同样对于or,从false开始将等同于false || restOfPredicate,如果falserestOfPredicate则评估为false,如果truerestOfPredicate,则为truetrue || restOfPredicate始终评估为true

底线:使用PredicateBuilder.True作为PredicateBuilder.And的中立起点,PredicateBuilder.False作为PredicateBuilder.Or

答案 1 :(得分:-1)

工作原理 True和False方法没有什么特别之处:它们只是用于创建Expression&gt;的简单方便的快捷方式。最初评估为真或假。以下是:

var predicate = PredicateBuilder.True(); 只是一个捷径:

表达式&GT;谓词= c =&gt;真正; 当您通过重复堆叠和/或条件构建谓词时,有一个起始点为true或false(分别)是有用的。

信息完整 http://www.albahari.com/nutshell/predicatebuilder.aspx