2011-12-18 13 views
1

3年後にEntity Framework v.Xを使用した後、EF4から奇妙な動作が見られました。 事実があることです、私は次のコマンドを実行し、データベースAdventureWorkでEntity Framework 4とT-SQLクエリの結果が一致しません

var query = (ObjectQuery) context.Products.Select(p => p.ProductDocuments.Where(c => c.ProductID == p.ProductID)); 
Console.WriteLine(query.ToTraceString()); 

ToTraceSstring()が実行される実際のクエリを示しています

一度SSMSから実行
SELECT 
[Project1].[ProductID] AS [ProductID], 
[Project1].[C1] AS [C1], 
[Project1].[ProductID1] AS [ProductID1], 
[Project1].[DocumentID] AS [DocumentID], 
[Project1].[ModifiedDate] AS [ModifiedDate] 
FROM (SELECT 
     [Extent1].[ProductID] AS [ProductID], 
     [Extent2].[ProductID] AS [ProductID1], 
     [Extent2].[DocumentID] AS [DocumentID], 
     [Extent2].[ModifiedDate] AS [ModifiedDate], 
     CASE WHEN ([Extent2].[ProductID] IS NULL) THEN CAST(NULL AS int) ELSE 1 
END AS [C1] 
     FROM [Production].[Product] AS [Extent1] 
     LEFT OUTER JOIN [Production].[ProductDocument] AS [Extent2] ON ([Extent1].[ProductID] = [Extent2].[ProductID]) AND ([Extent2].[ProductID] = [Extent1].[ProductID]) 
) AS [Project1] 
ORDER BY [Project1].[ProductID] ASC, [Project1].[C1] ASC 

505行を表示します。

しかし、私はEFから実行しよう:

var query= context.Products.Select(p => p.ProductDocuments.Where(c => c.ProductID == p.ProductID)); 
Console.WriteLine(query.Count()); 

それだけで504行を返します。

結果を比較すると、同じProductID = 506を持つProductDocumentには2つの行があるように見えますが、これは完全に正常です。これらの重複行は、期待どおりに2回ではなく1回だけ取り出されます。

その問題の考えはありますか?

答えて

1

あなたはそれであなたのラムダ式の素朴な解釈はあなたが単純に求めている暗示する、正しいです:

SELECT Products.* 
FROM Products 
INNER JOIN ProductDocuments 
    ON ProductDocuments.ProductID = Products.ProductID 

、代わりになっている:

SELECT DISTINCT Products.* 
FROM Products 
INNER JOIN ProductDocuments 
    ON ProductDocuments.ProductID = Products.ProductID 

はしかし、あなたは確信していますあなたが投稿したSQLは、コードがProductエンティティを要求している間にSQLが文書の一部を返すので、コードの結果ですか?もちろん、一連のプロダクトについては、重複するエンティティを返すことは無意味で間違っています。

1

SQLは正しいです。そしてその要求でLEFT OUTER JOINが期待されます。

しかし、ここでは質問結果が同じではないという質問があります。 ToTraceString()からダミーの解釈がありますか? IQueryableを読むときにナビゲーションがどのように表示されているかを最もよく見るためにリフレクタを使用します

関連する問題