PredicateBuilder<True>和PredicateBuilder<False>之间的区别是什么?

15

我有这段代码:

   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 的文档,但感觉有点混淆。我有一种感觉,这可能与我正在将谓词连接在一起有关吗?

3
我找不到有关那个类的任何文档,但我认为您的调用会创建一个等同于 true && (x.value1 == "1") && (x.value2 == "2") 的表达式,这取决于您的项目是否能评估为 truefalse(因此您会得到“您期望的结果”,无论那是什么)。另一方面,如果您从 false 开始,则该表达式永远无法评估为 true,因为将 false 进行且运算的结果是 false。因此,对于所有项目,谓词表达式都返回 false,您不会得到任何结果。 - O. R. Mapper
1
@O.R.Mapper - 谢谢。这里是文档链接:http://www.albahari.com/nutshell/predicatebuilder.aspx - Xaisoft
https://dev59.com/VW_Xa4cB1Zd3GeqP1XYX - Amir
我在使用“and”时会用True,而在使用“or”时则会用False,这样做总是能得到预期的结果。 - MIKE
如果您正在使用LinqKit Nuget包,则最新的实现已更改,并且是使用PredicateBuilder.New<T>()创建的,该方法等同于False。 - Sean Anderson
2个回答

11

使用 PredicateBuilder 逐步构建一个包含0个或多个条件的谓词时,最好从一个“中性”的谓词开始,以方便添加条件。这样一来,您只需遍历这些条件并将它们与最后一个andor在一起即可。例如:

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,如果restOfPredicate为真,则结果为true,否则为false。因此它被认为是中性的。

然而,从PredicateBuilder.False开始,等价于false && restOfPredicate,这将始终评估为false

同样地,对于or,从false开始等价于false || restOfPredicate,如果restOfPredicatefalse,则结果为false,如果restOfPredicatetrue,则结果为true。而true || restOfPredicate将始终评估为true

底线:在使用PredicateBuilder.And时,使用PredicateBuilder.True作为中性起点,而在使用PredicateBuilder.Or时,使用PredicateBuilder.False


0

工作原理 True和False方法没有特殊功能:它们只是方便的快捷方式,用于创建最初评估为true或false的Expression>。因此,以下内容:

var predicate = PredicateBuilder.True(); 只是这个的快捷方式:

Expression> predicate = c => true; 当您通过重复堆叠和/或条件来构建谓词时,拥有true或false(分别)的起点非常有用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接