繁体   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