【发布时间】:2010-03-01 19:25:52
【问题描述】:
给定与订单表 (Orders) 相关的订单项目表 (OrderItems),而订单表又与用户表 (用户),是否可以通过一个查询检索所有 OrderItems 并按 OrderId 将它们分组到字典中? IE。无需对 OrderItems 结果集执行迭代或对每个订单执行查询。
所需的控制器伪代码
Dictionary<int,IEnumerable<OrderItem>> OrderItems = DataContext.OrderItems.ToDictionary(Key => oi.OrderId, Value => oi.ToList());
所需用途:
IEnumerable<OrderItem> currentOrderItems = OrderItems[123]; // where 123 is OrderId
当前方法
在我的控制器中,我目前检索用户的订单和订单商品以传递给 Orders 视图:
ViewData["Orders"] = (from o in orders
where o.UserId equals CurrentUserId
orderby o.DateCreated descending)
.ToList();
ViewData["OrderItems"] = (from oi in DataContext.OrderItems
join o in DataContext.Orders
on oi.OrderId equals o.OrderId
where o.UserId equals CurrentUserId
select oi)
.ToList();
然后在我看来,我检索所有订单项:
IEnumerable<OrderItem> orderItems = ViewData["OrderItems"] as IEnumerable<OrderItem>;
并使用LINQ对每个订单的订单商品进行分组展示:
IEnumerable<OrderItem> currentOrderItems = orderItems.Where(
i => i.OrderId == order.OrderId
);
这是相当有效的,因为只有两个查询被传递到数据库并且在视图中完成了一些处理。但理想情况下,这应该在控制器中完成。
【问题讨论】:
标签: asp.net-mvc linq-to-sql dictionary grouping