2012-02-17 80 views
3

在所有我见过的关于谓词构建器的例子中,如果您正在构建“和”表达式条件,并且如果构建“或”表达式条件,则会显示一个包含PredicateBuilder.True的起始表达式。PredicateBuilder和或或者

我的问题是,情况总是如此,如果是的话,为什么不能简单地推断。我怀疑你一定是在建立一个“和”的表达,并且希望从一个错误开始。 “或”的相反

任何人都可以向我解释这一点吗?

回答

7

在表达式A和B以及C和D中,如果任何条件(A,B,C或D)都是False,则整个表达式为False。所以如果你用False开始一个“和”表达式,无论你和它是什么,整个表达式都是False。

与“或”表达式相同。在表达式A或B或C或D中,如果任何条件(A,B,C或D)为真,则整个表达式为True。所以,如果你用True开始一个“或”表达式,不管你对它做了什么,整个表达式都是真的。至于为什么你需要用字面True或False来启动一个PredicateBuilder,我相信这只是一个简单的使用PredicateBuilder的约定。你的表达式总是以(布尔)条件开始,后面跟着0或更多的“和/或条件”部分。所以你可以有“A”,或者“A和B”,或者“A和B和C”。你永远不会以“和A”开头。 PredicateBuilder的.And(条件)将“和条件”添加到表达式中,所以你不能从它开始。可能有一个构造函数让你创建你的表达式,并以一个初始条件开始它(新的表达式< ...>(A)?我没有实际检查...是否有一个?),但是你会必须以不同的方式(调用构造函数)处理第一个条件(您可能循环了一些事物集合并添加到表达式),而不是第二个和后续条件(调用.And(...)或.Or( ...))。 PredicateBuilder的.True < ...>()和.False < ...>()方法处理创建Expression以及添加第一个(通用)条件,以便您可以处理将第一个和所有后续条件添加到您的循环相同(通过调用.And(...)或.Or(...))。