2

这是我的场景(表格):

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

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

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

我想你明白了。这里没有什么不寻常的。

当导入到 EDMX 文件时OrderProductXREF表是不可见的实体。我看到的只是导航属性:实体Order的Products和实体Product的Orders

所以,我的问题: 我需要 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 的产品

谢谢

4

2 回答 2

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());
于 2012-03-20T16:56:10.620 回答
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;
于 2012-03-20T16:56:55.503 回答