2012-02-17 14 views
3

述語ビルダーで見たすべての例では、 "and"式の条件を作成する場合はPredicateBuilder.True、式の条件を作成する場合はPredicateBuilder.Falseの開始式が表示されます。PredicateBuilder And or Or

私の質問は、これは常にケースであり、そうであれば、なぜこれを単純に推論することはできませんでしたか?私はあなたが "と"の式を構築している場合があり、偽で始めることが必要であると思われます。 "または"と反対のもの

誰でもこのことを私に説明できますか?

答えて

7

式AおよびBおよびCおよびDにおいて、条件(A、B、CまたはD)のいずれかがFalseの場合、式全体がFalseになります。ですから、Falseで "and"式を始めると、それ以外のものがあっても、式全体がFalseになります。

「or」式と同じです。式AまたはBまたはCまたはDにおいて、条件(A、B、CまたはD)のいずれかが真である場合、式全体は真である。ですから、もしあなたがTrueを使って "or"式を始めるならば、それ以外にあなたがORに関係なく、式全体がTrueになります。

リテラルTrueまたはFalseでPredicateBuilderを開始する必要がある理由は、これは単にPredicateBuilderを使用しやすくするための規約だと思います。式は常に(真偽値)条件で始まり、0以上の "And/Or condition"部分が続きます。あなたは「A」、「AとB」、または「AとBとC」を持つことができます。あなたは "and A"で始まることはありません。 PredicateBuilderの.And(条件)は、式に "and condition"を追加します。そのため、開始できません。式を作成して初期条件(新しい式< ...>(A)?)で開始するコンストラクタが存在する可能性がありますが、実際にはチェックしていません。 2番目以降の条件(.And(...)または.Or()を呼び出すよりも、最初の条件を処理する必要があります(おそらく、いくつかのコレクションをループしてExpressionに追加する) ...))。 .Drue < ...>()および.False < ...>()メソッドは、Expressionを作成するだけでなく、最初の条件を追加することで、1番目およびすべての後続条件を追加できます。あなたのループは同じです(.And(...)または.Or(...)を呼び出すことによって)。