如何编写Linq(或lambda)语句来生成所有不在(或不存在)的元素

时间:2012-03-20 16:54:37

标签: linq entity-framework lambda not-exists

这是我的场景(表格):

Orders
======================
Id (int)  
description (varchar)

Products
======================
Id (int)
description (varchar)

OrderProductXREF (cross reference table)
======================
ProductId (int)
OrderId (int)

我觉得你有个主意。这里没什么不寻常的。

导入EDMX文件时 OrderProductXREF 表不可见实体。我所看到的只是导航属性:产品用于实体订单订单用于实体产品

所以,我的问题: 我需要Linq和/或Lambda语句,它将列出所有没有任何订单关联的产品。或者,列出所有从未订购的产品。

SQL会像这样:

SELECT * FROM Products
WHERE Id NOT IN 
   (SELECT ProductId 
    FROM OrderProductXREF)

修改 呃...对不起忘了我的问题中的一个小细节。

这是新的SQL:

SELECT * FROM Products
WHERE Id NOT IN 
   (SELECT ProductId 
    FROM OrderProductXREF
    WHERE OrderID = 1)

简而言之,所有未按ID = 1

排序的产品

由于

2 个答案:

答案 0 :(得分:2)

道歉 - 事先误读了这个问题。我怀疑你想要:

var query = db.Products.Where(product => !product.Orders.Any());

你应该检查生成的SQL。我希望期待它是明智的,但如果不是,你可能会想看看其他选择。

编辑:要检查不是订单ID 1的产品,您可以使用:

var query = db.Products.Except(db.Orders
                                 .Where(order => order.Id == 1)
                                 .Single()
                                 .Products);

或者:

var query = db.Products.Where(product => !product.Orders
                                                 .Where(order => order.Id == 1)
                                                 .Any());

答案 1 :(得分:2)

var q = from p in Context.Products
        where !p.Orders.Any()
        select p;

关于你的“一个小细节”:

var q = from p in Context.Products
        where !p.Orders.Any(o => o.Id == 1)
        select p;