2011-06-30 1 views
0

を生成した私は、EFの初心者ですので、私と一緒にクマ:EF - 多くのクエリを選択するための一つの問題では

oを私はDBには非常にまっすぐ進むの関係を有しています。 ts_Orderテーブル{ID、OrderDate、OrderNumber}およびts_OrderDetailsテーブル{ID、ProductId、OrderID}。両方の表のIDは、PK列とID列です。 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 

はなぜクエリが非常に複雑に生成されますか?何か不足していますか?私はEF実際にはそれほど悪くないことを生成する見てきたものの一部に基づいて

-Vinod

+0

単純にEFの仕組みです。 –

+0

Linq2Sqlは、このようなクエリをより良く/悪くしますか? – Magnus

+0

私はLINQ to SQLを一度も使用していません。私はそれを試みなければならないかもしれません!それがどうなってくるのか教えてあげましょう。 – Vinod

答えて

0

。あなたは何か悪いことはしていません。

EFが結果を生成するために使用するプロセスの詳細については、こちらを参照してください。 EFをできるだけ演奏するための良いガイドです。

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

関連する問題