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