14

我有代码:

   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谓词在一起的事实有关吗?

4

2 回答 2

11

当使用PredicateBuilder增量构建 0 个或多个条件的谓词时,从可以添加的“中性”谓词开始是很方便的,因为您可以只遍历条件,and或者or将它们与最后一个条件一起迭代。例如

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,其计算结果为trueifrestOfPredicate为真,并且falseifrestOfPredicatefalse。因此,为什么它被认为是中立的。

然而,从 开始PredicateBuilder.False,将是等价false && restOfPredicate的,它总是评估为false

同样,对于or,开始于false将等价于false || restOfPredicate,其计算结果为falseif restOfPredicateisfalsetrueif restOfPredicateis true。并且true || restOfPredicate总是评估为true.

底线:使用和PredicateBuilder.True用作中性起点。PredicateBuilder.AndPredicateBuilder.FalsePredicateBuilder.Or

于 2017-09-26T22:33:50.093 回答
-1

它是如何工作的 True 和 False 方法没有什么特别的:它们只是用于创建 Expression> 的便捷快捷方式,该表达式最初评估为真或假。所以以下内容:

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

表达式>谓词=c =>真;当您通过重复堆叠和/或条件来构建谓词时,将起点设置为真或假(分别)很有用。

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

于 2017-09-26T21:27:33.153 回答