LINQ Group by和where where子句

时间:2012-07-20 09:57:33

标签: c# linq

以下是我试图翻译的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'

1 个答案:

答案 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关键字)并返回不同的供应商。如果我正确理解您的目标 - 您希望获得分配给包含“原油”产品组产品的合同的所有供应商。

基本上,当您可以使用导航属性时,应尽量避免使用joinlinq to sql中的linq to entities。系统可能会更好地将它们转换为特定的sql