当表中没有其他行匹配条件时,Linq表达式选择行

时间:2013-01-04 17:13:45

标签: c# sql linq where

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

2 个答案:

答案 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();