0

我有一个包含 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);
4

2 回答 2

1
var items = itemsTable.Where(o => !o.Test2 && 
    !itemsTable.Any(x => x.Name == o.Name && x.Group == o.Group && x.Test2));
于 2013-01-04T17:45:15.383 回答
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();
于 2013-01-04T17:48:55.647 回答