以下是我试图翻译的SQL查询
SELECT dbo.Contracts.Supplier
FROM dbo.Contracts INNER JOIN dbo.Products ON dbo.Contracts.Product = dbo.Products.Product
where dbo.Products.ProductGroup='Crude'
GROUP BY dbo.Contracts.Supplier
我做错了什么,因为我没有得到与以下LINQ相同的结果
var result = from c in context.Contracts
join p in context.Products on c.Product equals p.Product1
where p.Product1.Equals("Crude")
group c by c.Supplier into g
select new { supplier = g.Key };
它正在产生一个奇怪的陈述
SELECT
1 AS [C1],
[Distinct1].[Supplier] AS [Supplier]
FROM ( SELECT DISTINCT
[Extent1].[Supplier] AS [Supplier]
FROM [dbo].[Contracts] AS [Extent1]
WHERE N'Crude' = [Extent1].[Product]
) AS [Distinct1]
使用distinct会起作用但是为了获得相同的结果,LINQ应该生成一个类似的语句(就像它忽略了连接一样):
SELECT distinct dbo.Contracts.Supplier
FROM dbo.Contracts INNER JOIN dbo.Products ON dbo.Contracts.Product = dbo.Products.Product
where dbo.Products.ProductGroup='Crude'
答案 0 :(得分:1)
我假设您正在使用'EntityFramework'或'Linq To SQL'。如果是这样,您应该能够使用navigation properties
导航到产品并过滤invalit结果。这样您的查询可能如下所示:
var result = (from c in context.Contracts
where c.Products.Any(p => p.ProductGroup == "Crude")
select c.Supplier).Distinct();
它会自动转换为正确的查询(在这种情况下可能没有连接,只需使用Exists
sql关键字)并返回不同的供应商。如果我正确理解您的目标 - 您希望获得分配给包含“原油”产品组产品的合同的所有供应商。
基本上,当您可以使用导航属性时,应尽量避免使用join
或linq to sql
中的linq to entities
。系统可能会更好地将它们转换为特定的sql
。