Linq组由+每组所在

时间:2009-09-22 15:57:38

标签: linq

我想编写一个linq表达式,它将返回不包含特定值的ID。例如,我想返回所有不具有Value = 30的不同ID。

ID, Value  
1, 10  
1, 20  
1, 30  
2, 10  
2, 20  
3, 10  
3, 20

结果应为2和3,因为非这些值的值为30。

这可以用单个表达式吗?

由于

2 个答案:

答案 0 :(得分:3)

当然,这样做会:

var query = from i in list
            group i by i.GroupId into g
            where g.Any(p => p.ItemId == 30) == false
            select g.Key;

foreach(var result in query) { Console.WriteLine(result); }

输出:

2
3

我在这里使用了一个例子:

class Product {
    public int GroupId { get; set; }
    public int ItemId { get; set; }
}

var list = new List<Product>() {
    new Product() {GroupId = 1, ItemId = 10},
    new Product() {GroupId = 1, ItemId = 20},
    new Product() {GroupId = 1, ItemId = 30},
    new Product() {GroupId = 2, ItemId = 10},
    new Product() {GroupId = 2, ItemId = 20},
    new Product() {GroupId = 3, ItemId = 10},
    new Product() {GroupId = 3, ItemId = 20},
};

答案 1 :(得分:0)

我没有Linq,但这是SQL Server SQL做你想做的事情:

DECLARE @YourTable table (ID int, value int)

insert into @YourTable VALUES (1, 10)
insert into @YourTable VALUES (1, 20)
insert into @YourTable VALUES (1, 30)
insert into @YourTable VALUES (2, 10)
insert into @YourTable VALUES (2, 20)
insert into @YourTable VALUES (3, 10)
insert into @YourTable VALUES (3, 20)


SELECT DISTINCT ID
    FROM @YourTable y1
    WHERE NOT EXISTS (SELECT Value 
                      FROM @YourTable y2
                      WHERE y1.ID=y2.id and y2.value=30)

输出:

ID
-----------
2
3

(2 row(s) affected)