我有代码:
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谓词的事实有关?
发布于 2017-09-27 06:33:50
当使用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,如果restOfPredicate为true,则计算结果为true;如果restOfPredicate为false,则计算结果为false。这就是为什么它被认为是中立的。
然而,从PredicateBuilder.False开始,将等同于false && restOfPredicate,它的计算结果始终为false。
类似地,对于or,从false开始将等同于false || restOfPredicate,如果restOfPredicate为false,则计算结果为false,如果restOfPredicate为true,则计算结果为true。而true || restOfPredicate的计算结果总是为true。
底线:使用PredicateBuilder.True作为PredicateBuilder.And的中立起点,使用PredicateBuilder.False作为PredicateBuilder.Or的起点。
发布于 2017-09-27 05:27:33
它的工作原理True和false方法没有什么特别之处:它们只是创建初始计算结果为true或False的Expression>的便捷快捷方式。因此,如下所示:
var predicate = PredicateBuilder.True ();只是一个快捷方式:
Expression> predicate =c => true;当您通过重复堆叠和/或条件来构建谓词时,起点分别为true或false是很有用的。
信息完成http://www.albahari.com/nutshell/predicatebuilder.aspx
https://stackoverflow.com/questions/16695523
复制相似问题