0

製品のリストを照会しようとしていますが、各製品には注文のリストがあります。

だから、このようなもの:

from s in products
join o in orders on s.ProductID = o.ProductID
select new ProductRecord
{
  ProductName = s.Name,
  OrderList = o.Select(x=>new OrderRecord(OrderID = x.OrderID, OrderName = x.OrderName).ToList()
}

OrderList はList<OrderRecord>

私のクエリはこれよりもはるかに複雑ですが、これはアイデアを示しています。

最後に、私のウェブページに次のようなものをリストしたいと思います。

Product 1
    Order 1
    Order 2
    Order 3

Product 2
    Order 4
    Order 5
    Order 6

しかし、これはあまりうまく機能していません。これは遅いクエリであり、Mini Profiler によると、ページに 100 個の重複したクエリがあると表示されます。私がそのものを取り出すと、OrderListすべてがきびきびします。

私はすべて間違って問題に取り組んでいると思います。これを効率的にクエリするにはどうすればよいですか?

4

1 に答える 1

3

クエリから削除ToListします。また、グループ結合を使用して製品の注文を取得します。

var query = from s in context.Products
            join o in context.Orders on s.ProductID equals o.ProductID into g
            select new ProductRecord
            {
                  ProductName = s.Name,
                  OrderList = g.Select(x => new OrderRecord() 
                                            { 
                                                OrderID = x.OrderID, 
                                                OrderName = x.OrderName
                                            })
            };

OrderList である必要がありますIEnumerable<OrderRecord>。このようなクエリに対して SQL プロファイラーが表示する内容は次のとおりです。

SELECT 
[Project1].[C1] AS [C1], 
[Project1].[Name] AS [Name], 
[Project1].[C2] AS [C2], 
[Project1].[OrderID] AS [OrderID]
FROM ( SELECT 
    [Extent1].[Name] AS [Name], 
    1 AS [C1], 
    [Extent2].[OrderID] AS [OrderID], 
    CASE WHEN ([Extent2].[OrderID] IS NULL) 
         THEN CAST(NULL AS int) ELSE 1 END AS [C2]
    FROM  [dbo].[Products] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Orders] AS [Extent2] 
         ON [Extent1].[ProductID] = [Extent2].[ProductID]
)  AS [Project1]
ORDER BY [Project1].[ProductID] ASC, [Project1].[C2] ASC
于 2012-12-09T21:22:47.163 に答える