意外结果LINQ Where子句

时间:2012-10-16 21:29:30

标签: c# linq where-clause fluent

我有一个通过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子句之前和之后的计数来评估列表。

4 个答案:

答案 0 :(得分:3)

这一行

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);

答案 1 :(得分:1)

如果你想删除所有项目,bool_a和bool_b都是假的,你需要

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

答案 2 :(得分:0)

您正在使用的以下过滤器将只保留A和B都为FALSE的项目:

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

如果您只想保留A为TRUE且B为假的记录,请使用:

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

最后,您要检查的是A = TRUE的记录数:

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

确保您想要查看。

答案 3 :(得分:-1)

尝试:

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