当使用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为真,并且falseifrestOfPredicate为false。因此,为什么它被认为是中立的。
然而,从 开始PredicateBuilder.False,将是等价false && restOfPredicate的,它总是评估为false。
同样,对于or,开始于false将等价于false || restOfPredicate,其计算结果为falseif restOfPredicateisfalse和trueif restOfPredicateis true。并且true || restOfPredicate总是评估为true.
底线:使用和PredicateBuilder.True用作中性起点。PredicateBuilder.AndPredicateBuilder.FalsePredicateBuilder.Or