2011-06-30 58 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