2011-06-30 19 views
0

我是EF新手,所以忍耐一下:○EF - 問題在一對多選擇查詢生成

我在DB一個非常簡單的關係。 ts_Order表{ID,OrderDate,OrderNumber}和ts_OrderDetails表{ID,ProductId,OrderID}。兩個表中的ID都是PK和標識列。 ts_OrderDetails表中的OrderID是FK,並引用ts_Order表的ID列。

我需要選擇所有訂單以及每個訂單可能具有的每個細節。在SQL我會寫這樣的事情:

select * from ts_Order ORD inner join ts_OrderDetails DTL on ORD.ID=DTL.OrderID 

這工作得很好。

當我嘗試做的EF類似的東西:

List<Order> result = context.Orders.Include("OrderDetails").Where(i => i.ID > 0).ToList(); 

這是由EF生成的內容:

SELECT 
[Project1].[ID] AS [ID], 
[Project1].[OrderDate] AS [OrderDate], 
[Project1].[OrderNumber] AS [OrderNumber], 
[Project1].[C1] AS [C1], 
[Project1].[ID1] AS [ID1], 
[Project1].[Product] AS [Product], 
[Project1].[OrderID] AS [OrderID] 
FROM (SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[OrderDate] AS [OrderDate], 
    [Extent1].[OrderNumber] AS [OrderNumber], 
    [Extent2].[ID] AS [ID1], 
    [Extent2].[Product] AS [Product], 
    [Extent2].[OrderID] AS [OrderID], 
    CASE WHEN ([Extent2].[ID] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1] 
    FROM [dbo].[ts_Order] AS [Extent1] 
    LEFT OUTER JOIN (SELECT 
     [ts_OrderDetails].[ID] AS [ID], 
     [ts_OrderDetails].[Product] AS [Product], 
     [ts_OrderDetails].[OrderID] AS [OrderID] 
     FROM [dbo].[ts_OrderDetails] AS [ts_OrderDetails]) AS [Extent2] ON [Extent1].[ID] = [Extent2].[OrderID] 
    WHERE [Extent1].[ID] > 0 
) AS [Project1] 
ORDER BY [Project1].[ID] ASC, [Project1].[C1] ASC 

爲什麼會產生如此複雜的查詢?我錯過了什麼嗎?

-Vinod

+0

只要是EF如何工作的。 –

+0

Linq2Sql會做出什麼樣的查詢,更好還是更差? – Magnus

+0

我從來沒有使用過LINQ to SQL。可能是我應該嘗試一下!我會讓你知道它出現了什麼。 – Vinod

回答

0

基於我看到的EF生成的一些東西,實際上並不算太壞。你沒有做錯任何事情。

如果您想了解有關EF用於生成結果的過程的更多信息,這是一個很好的閱讀。也是一個很好的體面指南,使EF作爲性能儘可能。

http://msdn.microsoft.com/en-us/library/cc853327.aspx