2012-10-16 45 views
0

我有一种方法,通过LINQ限制列表中的项目。该列表包含具有两个布尔属性的项目:bool_a和bool_b。该列表包含bool_a为true且bool_b为false的项目以及两者均为false的项目。意外的结果LINQ Where子句

我的期望是,一旦我限制了列表,只有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子句之前和之后使用计数来评估列表。

+1

我不知道这是没有数据样本和相应的查询结果回答的。 –

+0

而“问题陈述”有点奇怪的措辞。 – user7116

回答

3

此行

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

结果中仅记录具有有x.bool_a所以逻辑上的下一行有没有x.bool_a项目的项目!

,因为你说,所有x.bool_b都是假的这是真实的,因此该声明是真的没有什么不同:

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

编辑:

,你就应该能够如果您使用此查询希望所有的记录,其中bool_a是真实的,bool_b是假的:

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

感谢罗布。我希望Where条件在决定记录是否符合条件之前先评估所有包含的表达式。 – goatshepard

+1

@goatshepard - 它会但第二部分总是会评估为true,因为所有!x.bool_b都是真的,所以整个语句总是与x.bool_a的true/false状态相关联,因此它总是会返回所有! x.bool_a – Rob

-1

尝试:

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

您使用的意志只剩项目,其中A和B均为FALSE以下过滤器:

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

如果你想只保留记录,其中A为真,B是假的,使用:

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

最后,你正在检查是多少条记录与A = TRUE:

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

确保这是你想要检查。

1

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

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