簡體   English   中英

意外結果LINQ Where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM