2012-07-20 95 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