[英]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 sql
或linq to entities
。 系统可能会更好地将它们转换为特定的sql
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.