首先使用 EF DB,我有两个具有多对多关系的实体(供应商、产品)。Entity Framework 不会为关联表 (SupplierProduct) 创建实体,因为关联表仅包含强实体的主键。
我通过以下查询获得了所有不提供给定产品的供应商:
var q1 = context.Suppliers.Where(s=>!s.Products.Any(p=>p.Id == 1));
生成的 SQL 使用与此类似的 EXISTS 相关子查询:
SELECT *
FROM Suppliers s
WHERE NOT EXISTS
(SELECT 1
FROM SupplierProduct sp WHERE sp.SupplierId = s.Id && sp.ProductId = 1)
是否有可能使用 Linq to Entities 方法语法来生成在关联表上使用连接的查询?
IE:
SELECT DISTINCT s.*
FROM SupplierProduct sp
JOIN Supplier s ON s.Id = sp.SupplierId;
WHERE sp.ProductId != 1
更新
正如 JoeEnos 所指出的,我上面的查询并没有做同样的事情。NOT EXISTS 子查询可能是最好的方法。如果我试图找到所有提供产品的供应商怎么办?我会将我的 linq 更改为实体查询:
var q1 = context.Suppliers.Where(s => s.Products.Any(p=>p.Id == 1));
生成的 SQL 将是:
SELECT *
FROM Suppliers s
WHERE EXISTS
(SELECT 1
FROM SupplierProduct sp WHERE sp.SupplierId = s.Id && sp.ProductId = 1)
这很好,我得到了我想要的结果。但是,如果我在这种情况下编写 SQL,我通常会这样做:
SELECT s.*
FROM SupplierProduct sp
JOIN Supplier s ON s.Id = sp.SupplierId;
WHERE sp.ProductId = 1
可以更改我的 linq to entity 查询以生成上述 SQL 吗?