【发布时间】: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<Value>(),它会带回我所期望的,但如果我有PredicateBuilder.False<Value>(),它会带回0条记录。有人可以解释区别是什么以及为什么在一种情况下我得到 0 条记录,而在另一种情况下我得到了我所期望的。我已经阅读了PredicateBuilder 文档,但这有点令人困惑。我感觉这与我是 Anding 谓词在一起的事实有关?
【问题讨论】:
-
我找不到关于该类的任何文档,但我认为您的调用创建了一个等效于
true && (x.value1 == "1") && (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