【问题标题】:Difference between PredicateBuilder<True> and PredicateBuilder<False>?PredicateBuilder<True> 和 PredicateBuilder<False> 的区别?
【发布时间】:2017-09-27 08:08:11
【问题描述】:

我有代码:

   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&lt;Value&gt;(),它会带回我所期望的,但如果我有PredicateBuilder.False&lt;Value&gt;(),它会带回0条记录。有人可以解释区别是什么以及为什么在一种情况下我得到 0 条记录,而在另一种情况下我得到了我所期望的。我已经阅读了PredicateBuilder 文档,但这有点令人困惑。我感觉这与我是 Anding 谓词在一起的事实有关?

【问题讨论】:

  • 我找不到关于该类的任何文档,但我认为您的调用创建了一个等效于 true &amp;&amp; (x.value1 == "1") &amp;&amp; (x.value2 == "2") 的表达式,它可能会或可能不会评估为 true,具体取决于您的项目(因此你会得到“你期望的”,不管是什么)。另一方面,如果您从false 开始,则表达式可能永远 评估为true,因为与false 相加会导致false。因此,谓词表达式为所有项目返回false,您不会得到任何结果。
  • @O.R.Mapper - 谢谢。这是文档:albahari.com/nutshell/predicatebuilder.aspx
  • 我将 True 与“and”一起使用,将 False 与“or”一起使用,我总是得到预期的结果
  • 如果您使用的是 LinqKit Nuget 包,则最新的实现已更改并使用 PredicateBuilder.New() 创建,相当于 False。

标签: c# entity-framework linq predicatebuilder linqkit


【解决方案1】:

当使用PredicateBuilder 以增量方式构建包含 0 个或多个条件的谓词时,从可以添加的“中性”谓词开始是很方便的,因为您可以只遍历条件和 @987654322 @ 或 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 &amp;&amp; restOfPredicate,如果restOfPredicate 为真,则为true,如果restOfPredicatefalse,则为false。因此它被认为是中立的。

但是,从 PredicateBuilder.False 开始,将等效于 false &amp;&amp; restOfPredicate,其结果始终为 false

对于or 类似,以false 开头将等效于false || restOfPredicate,如果restOfPredicatefalse,则计算结果为false,如果restOfPredicatetrue,则计算结果为true。而true || restOfPredicate 的计算结果总是true

底线:使用PredicateBuilder.True 作为PredicateBuilder.And 的中性起点,PredicateBuilder.FalsePredicateBuilder.Or

【讨论】:

    【解决方案2】:

    它是如何工作的 True 和 False 方法没有什么特别之处:它们只是用于创建 Expression> 的便捷快捷方式,该表达式最初的计算结果为 true 或 false。所以如下:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      相关资源
      最近更新 更多