2012-07-20 84 views
3

下面是SQL查询我想翻译LINQ集团通过具有where子句

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] 

使用不同将工作,但得到相同的结果,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' 
+2

如果您只对'p.Product1'为'“Product1”'的产品感兴趣,为什么不在分组之前过滤掉*? – 2012-07-20 10:02:12

+0

想知道为什么你需要在这种情况下分组。 – hazzik 2012-07-20 10:03:41

+0

我们正在将Access应用程序转换为ASP.NET MV3网站(使用实体框架作为数据层),因此上述查询是从Access生成的,我只是翻译了那里的内容! ...或者至少现在想要尝试。 – gmang 2012-07-20 10:05:44

回答

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(); 

它会自动转换成正确的查询(在这种情况下,可能没有参加,甚至,只是用Exists SQL关键字),并返回不同的供应商。这是如果我正确理解您的目标 - 您希望获得分配到包含来自“原油”产品组的产品的合同的所有供应商。

基本上你应该尽量避免使用从linq to sqllinq to entitiesjoin s尽可能使用导航属性。系统可能会更好地将它们转换为具体的sql

+0

这是一个愚蠢的错误,我使用了错误的列,谢谢你的第二套眼睛!就是这样...... where子句位于ProductGroup而不是产品。 Oppps :) – gmang 2012-07-20 13:37:39

+0

我下载了LINQPAD,使它更容易排除故障 – gmang 2012-07-20 13:39:20