2013-05-22 13 views
7

私はコードを持っている:私はPredicateBuilder.True<Value>()を持っている場合はPredicateBuilder <True>と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.False<Value>()を持っている場合、それが戻って0レコードをもたらします。誰かが違いが何であるかを説明することができます。なぜなら、1つのシナリオでは、0のレコードをもう1つのレコードに戻すのは、私が期待するものを得るためです。私は既にPredicateBuilderの文書を読んでいましたが、ちょっと混乱しました。私はそれが私がAndingの述語であるという事実と関係していると感じていますか?

+3

そのクラスに関するドキュメントは見つかりませんでしたが、あなたの呼び出しが 'true &&(x.value1 ==" 1 ")&&(xと同等の式を作成すると仮定します。value2 == "2") '、これはあなたのアイテムに応じて評価されるかもしれないし、評価されないかもしれません(したがって、あなたは何を期待しています。一方、 'false'から始めると、' false'という結果が 'false'になるので、式は* never *' true'に評価されます。したがって、述語式はすべての項目に対して 'false'を返し、結果は返されません。 –

+1

@ O.R.Mapper - ありがとう。ここにドキュメントがあります:http://www.albahari.com/nutshell/predicatebuilder.aspx – Xaisoft

+0

http://stackoverflow.com/questions/15325245/linqkit-predicatebuilder-returns-all-or-non-rows – mirtiger

答えて

-1

動作方法 真と偽のメソッドは何も特別なことはありません。最初は真または偽と評価される式を作成するための便利なショートカットです。したがって、次のようになります。

var predicate = PredicateBuilder.True(); はこれのショートカットです。

Expression> predicate = c => true; 繰り返し積み重ねたり条件を付けたりして述語を作成するときは、開始点をそれぞれ真または偽にすると便利です。

情報の完全 http://www.albahari.com/nutshell/predicatebuilder.aspx

1

漸増0以上の条件の述語を構築するためにPredicateBuilderを使用するときは、その後だけ繰り返すことができるので、に追加することができ、「中立」の述語をオフに開始することが便利です条件を介してandまたはorのいずれかを最後のものと一緒に使用します。例えば。

var predicate = PredicateBuilder.True<Value>(); 

foreach (var item in itemsToInclude) { 
    predicate = predicate.And(o => o.Items.Contains(item)); 
} 

これは、より簡単なブール論理に相当します:

true && ((o.Items.Contains(itemsToInclude[0] && o.Items.Contains.itemsToInclude[1]) ...) 

それともtrue && restOfPredicateに相当します

var predicate = true; 

foreach (var item in itemsToInclude) { 
    predicate = predicate && o.Items.Contains(item); 
} 

restOfPredicateが真の場合trueに評価し、 restOfPredicatefalseの場合、falseです。なぜ中立と見なされるのですか?

しかし、PredicateBuilder.Falseで始まるのは、false && restOfPredicateとなり、常にfalseと評価されます。

同様orため、falseを用いて出発してrestOfPredicatetrueある場合restOfPredicatefalsetrueある場合falseに評価され、false || restOfPredicateに相当するであろう。 true || restOfPredicateは常にtrueと評価されます。

ボトムラインPredicateBuilder.And、およびPredicateBuilder.OrPredicateBuilder.False中立の出発点としてPredicateBuilder.Trueを使用してください。

関連する問題