[英]Unexpected Result LINQ Where Clause
我有一種方法可以通過LINQ限制列表中的項目。 該列表包含具有兩個布爾屬性的項目:bool_a和bool_b。 該列表包含bool_a為true和bool_b為false的項目以及兩者均為false的項目。
我的期望是,一旦我限制了該列表,將僅保留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子句前后的計數來評估列表。
這條線
records = records.Where(x => !x.bool_a && !x.bool_b);
結果記錄中僅包含具有!x.bool_a的項目,因此從邏輯上講,下一行沒有x.bool_a項。
這是正確的,因為您聲明所有x.bool_b均為false,因此該語句實際上與以下內容沒有區別:
records = records.Where(x => !x.bool_a);
編輯:
如果要獲取bool_a為true和bool_b為false的所有記錄,則應該可以使用此查詢:
records = records.Where(x => x.bool_a && !x.bool_b);
如果要刪除所有項目,其中bool_a和bool_b均為假,則需要
records = records.Where(x => x.bool_a || x.bool_b);
您使用的以下過濾器將僅保留A和B均為FALSE的項目:
records = records.Where(x => !x.bool_a && !x.bool_b);
如果只保留A為TRUE且B為False的記錄,請使用:
records = records.Where(x => x.bool_a && !x.bool_b);
最后,您要檢查的是多少條A = TRUE的記錄:
var count_where_a_after = records .Where(x => x.bool_a);
確保這是您要檢查的。
嘗試:
var records = GetRecords().Where(!(x => x.bool_a && x.bool_b));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.