繁体   English   中英

LINQ Group by和where where子句

[英]LINQ Group by and having where clause

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM