3

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

1 回答 1

1

我假设您使用的是“EntityFramework”或“Linq To SQL”。如果是这样,您应该能够使用navigation properties导航到产品并过滤无效结果。这样您的查询可能看起来像这样:

var result = (from c in context.Contracts
              where c.Products.Any(p => p.ProductGroup == "Crude")
              select c.Supplier).Distinct();

它将自动转换为正确的查询(在这种情况下甚至可能没有连接,只使用Existssql 关键字)并返回不同的供应商。这是如果我正确理解您的目标 - 您希望获得分配给包含“粗”产品组产品的合同的所有供应商。

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

于 2012-07-20T13:27:45.283 回答