2012-10-16 46 views
0

我有一種方法,通過LINQ限制列表中的項目。該列表包含具有兩個布爾屬性的項目:bool_a和bool_b。該列表包含bool_a爲true且bool_b爲false的項目以及兩者均爲false的項目。意外的結果LINQ Where子句

我的期望是,一旦我限制了列表,只有bool_a爲false的記錄將保留,而bool_a和bool_b都爲false的所有項目都將被刪除。但是,我發現所有項目都被刪除。就好像AND運算符表現得像一個OR。

下面是一個例子。我沒有看到什麼?

var records = GetRecords(); 
var count_where_a_before = records .Where(x => x.bool_a); // 100 items 
var count_where_ab_before = records .Where(x => x.bool_a && x.bool_b); // 10 items 
records = records.Where(x => !x.bool_a && !x.bool_b); 
var count_where_a_after = records .Where(x => x.bool_a); // 0 items 

正如你從上面看到的,我一直在where子句之前和之後使用計數來評估列表。

+1

我不知道這是沒有數據樣本和相應的查詢結果回答的。 –

+0

而「問題陳述」有點奇怪的措辭。 – user7116

回答

3

此行

records = records.Where(x => !x.bool_a && !x.bool_b); 

結果中僅記錄具有有x.bool_a所以邏輯上的下一行有沒有x.bool_a項目的項目!

,因爲你說,所有x.bool_b都是假的這是真實的,因此該聲明是真的沒有什麼不同:

records = records.Where(x => !x.bool_a); 

編輯:

,你就應該能夠如果您使用此查詢希望所有的記錄,其中bool_a是真實的,bool_b是假的:

records = records.Where(x => x.bool_a && !x.bool_b); 
+0

感謝羅布。我希望Where條件在決定記錄是否符合條件之前先評估所有包含的表達式。 – goatshepard

+1

@goatshepard - 它會但第二部分總是會評估爲true,因爲所有!x.bool_b都是真的,所以整個語句總是與x.bool_a的true/false狀態相關聯,因此它總是會返回所有! x.bool_a – Rob

-1

嘗試:

var records = GetRecords().Where(!(x => x.bool_a && x.bool_b)); 
0

您使用的意志只剩項目,其中A和B均爲FALSE以下過濾器:

records = records.Where(x => !x.bool_a && !x.bool_b); 

如果你想只保留記錄,其中A爲真,B是假的,使用:

records = records.Where(x => x.bool_a && !x.bool_b); 

最後,你正在檢查是多少條記錄與A = TRUE:

var count_where_a_after = records .Where(x => x.bool_a); 

確保這是你想要檢查。

1

如果你想刪除所有項目,其中兩個bool_a和bool_b都是假的,你需要

records = records.Where(x => x.bool_a || x.bool_b);