2013-05-22 81 views
7

我的代碼: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.True<Value>(),它帶回我所期望的,但如果我有PredicateBuilder.False<Value>(),它帶回0的記錄。有人可以解釋其中的區別是什麼,爲什麼在一種情況下,我得到0條記錄,另一條我得到了我所期望的。我已經閱讀了PredicateBuilder文檔,但它有點令人困惑。我有一種感覺,它與我一起的謂詞Anding有關嗎?

+3

我找不到關於該類的任何文檔,但我會假設你的調用創建了一個相當於'true &&(x.value1 ==「1」)&&(x。value2 ==「2」)',根據您的項目可能會或可能不會被評估爲「真實」(因此您可以回到「您期望的內容」,無論如何)。另一方面,如果從「false」開始,則表達式可能永遠不會評估爲「true」,因爲「false」會導致「false」。因此,謂詞表達式將返回所有項目的「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

工作原理 True和False方法沒有什麼特別之處:它們只是用於創建Expression>的最簡單方便的捷徑,最初計算結果爲true或false。所以如下:

var predicate = PredicateBuilder.True(); 只是這個的一個快捷方式:

Expression> predicate = c => true; 當您通過重複堆疊和/或條件構建謂詞時,分別具有true或false(分別)的出發點很有用。

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

1

當使用PredicateBuilder逐步建立的0或多個條件謂詞,可以很方便地與可以添加到「中性」謂詞開始,因爲你可以那麼就遍歷通過條件和andor他們在一起是最後一個。例如。

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 && restOfPredicate,其計算結果爲true如果restOfPredicate是真實的, false如果restOfPredicatefalse。因此爲什麼它被認爲是中性的。

然而,從PredicateBuilder.False開始,將等於false && restOfPredicate,它總是評估爲false

類似地,對於or,與false起步將相當於false || restOfPredicate,其評估爲false如果restOfPredicatefalsetrue如果restOfPredicatetrue。而true || restOfPredicate總是會評估爲true

底線:使用PredicateBuilder.TruePredicateBuilder.And中性起點,PredicateBuilder.FalsePredicateBuilder.Or

相關問題