我想编写一个linq表达式,它将返回不包含特定值的ID。例如,我想返回所有不具有Value = 30的不同ID。
ID, Value
1, 10
1, 20
1, 30
2, 10
2, 20
3, 10
3, 20
结果应为2和3,因为非这些值的值为30。
这可以用单个表达式吗?
由于
答案 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)