繁体   English   中英

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

[英]Difference between PredicateBuilder<True> and PredicateBuilder<False>?

我有代码:

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

当使用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如果restOfPredicatefalserestOfPredicatefalse 因此,为什么它被认为是中立的。

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

类似地, or ,以false开头将等同于false || restOfPredicate false || restOfPredicate ,其计算结果为false ,如果restOfPredicatefalsetrue如果restOfPredicatetrue true || restOfPredicate true || restOfPredicate将始终评估为true

底线 :使用PredicateBuilder.True与中性起点PredicateBuilder.And ,并PredicateBuilder.FalsePredicateBuilder.Or

工作原理True和False方法没有什么特别之处:它们只是用于创建最初计算为true或false的Expression>的简便快捷方式。 所以以下内容:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM