我有一个包含3列的表格:
名称 varchar
测试1 位
测试2 位
群组 varchar
目的:
我想选择每组每个名称只有test1为真的所有行。
为了澄清,请采用以下示例记录:
Name | Test1 | Test2 | Group
Foo True False Group 1
Bar True False Group 1
Bar False True Group 2
Foo False True Group 1
123 True False Group 1
第二行将被选中,因为对于具有相同“名称”值的同一组,它从未对Test2进行过测试。
第一行不会被选中,在表格中的某个点上,对于具有相同组名的Test2,测试为真。
将选择最后一行,因为它从未对Test2进行过测试。
注意:我有要明确搜索的组名。
我尝试过什么
我尝试过(并且有效)是选择测试1为真的所有行。然后我为每个id做了另一次搜索(迭代第一个查询的结果)并测试它是否再次出现。我在这里做的是一个解决方法,我知道Linq有很多“不存在”的功能,我想利用它们来改善我到目前为止写的内容的状态,所以希望我可以把它全部推出来一个声明。
代码示例
var items = itemsTable.Where(o => o.Group.Equals(GroupName) && o.Test1);
答案 0 :(得分:1)
var items = itemsTable.Where(o => !o.Test2 &&
!itemsTable.Any(x => x.Name == o.Name && x.Group == o.Group && x.Test2));
答案 1 :(得分:1)
您可以使用以下内容:
var items = itemsTable.GroupBy(e => new { e.Name, e.Group }, e => e)
.Where(g => !g.Any(e => e.Test2) && g.Key.Group.Equals(groupName))
.SelectMany(e => e).ToList();