C# 意外结果LINQ Where子句
我有一个方法,通过LINQ限制列表中的项目。该列表包含具有两个布尔属性的项:布尔值a和布尔值b。该列表包含bool_a为真、bool_b为假的项目以及两者均为假的项目 我的期望是,一旦我限制了列表,只有bool_a为false的记录将保留,而bool_a和bool_b均为false的所有项目将被删除。但是,我发现所有项目都被删除。这就好像AND运算符的行为类似于OR 下面是一个例子。我没有看到什么C# 意外结果LINQ Where子句,c#,linq,where-clause,fluent,C#,Linq,Where Clause,Fluent,我有一个方法,通过LINQ限制列表中的项目。该列表包含具有两个布尔属性的项:布尔值a和布尔值b。该列表包含bool_a为真、bool_b为假的项目以及两者均为假的项目 我的期望是,一旦我限制了列表,只有bool_a为false的记录将保留,而bool_a和bool_b均为false的所有项目将被删除。但是,我发现所有项目都被删除。这就好像AND运算符的行为类似于OR 下面是一个例子。我没有看到什么 var records = GetRecords(); var count_where_a_bef
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子句前后的计数来计算列表 试试看:
var records = GetRecords().Where(!(x => x.bool_a && x.bool_b));
尝试:
这条线
records = records.Where(x => !x.bool_a && !x.bool_b);
结果记录中只包含具有以下属性的项!x、 所以逻辑上下一行没有x.bool\u 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);
这条线
records = records.Where(x => !x.bool_a && !x.bool_b);
结果记录中只包含具有以下属性的项!x、 所以逻辑上下一行没有x.bool\u 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);
您正在使用的以下筛选器将只保留项目,其中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);
确保这是您要检查的内容。您正在使用的以下筛选器将只留下项目,其中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);
确保这是您要检查的内容。如果要删除所有项目,其中bool_a和bool_b均为false,则需要
records = records.Where(x => x.bool_a || x.bool_b);
如果要删除所有项目,其中bool_a和bool_b均为false,则需要
records = records.Where(x => x.bool_a || x.bool_b);
如果没有数据样本和相应的查询结果,我不确定这是否可以回答。“问题陈述”的措辞有点奇怪。如果没有数据样本和相应的查询结果,我不确定这是否可以回答。“问题陈述”的措辞有点奇怪。谢谢Rob。我希望Where条件在决定一条记录是否满足条件之前对所有包含的表达式进行求值。@GoatSchepard-它会满足条件,但第二部分的求值结果将始终为true,因为all!x、 bool_b是真的,所以整个语句始终是x.bool_a的真/假状态的枢纽,所以它总是返回所有!x、 罗布。我希望Where条件在决定一条记录是否满足条件之前对所有包含的表达式进行求值。@GoatSchepard-它会满足条件,但第二部分的求值结果将始终为true,因为all!x、 bool_b是真的,所以整个语句始终是x.bool_a的真/假状态的枢纽,所以它总是返回所有!x、 布卢阿