在一对多的关系中,以下哪种情况有更好的表现。
第一种方法
public Order GetOrder(long orderId) {
var orderDetails =
(from o in Orders
from d in OrderDetails
where d.OrderId = o.Id && o.Id = orderId
select new {
Order = o,
Detail = d
}).ToList();
var order = orderDetails.First().Order;
order.Details = orderDetails.Select(od => od.Detail).ToList();
return order;
}
第二种方法
public Order GetOrder(long orderId) {
var order = Orders.First(o => o.Id == orderId);
order.Details = OrderDetails.Where(od => od.OrderId = orderId).ToList();
return order;
}
我试图弄清楚(就性能而言)是,在第一种方法中存在单个查询但是正在选择重复数据,其中,在第二种方法中,存在两个单独的查询但是仅选择数据够了。
您可以假设Orders
和OrderDetails
是IQueryable<T>
的EntityFramework(dbContext.Set<T>()
)或NHibernate(session.Query<T>()
)。我尝试了两者,他们创建了非常相似的SQL查询。据我所知,这些ORM内置于一对多查询中,使用的方法类似于第一种方法。
更新,澄清我在问什么:哪一个(单个查询但重复数据或只需要数据但多个查询)在哪种情况下表现更好?我可能没有想到很多情况。这就是我没有尝试基准测试的原因。正如在一些答案中已经说明的那样,列数或更多联接是我期望的答案类型。 (可能还有关于表和/或结果集的行数)。基于这些答案,我可以尝试基准测试。当然,我在问为什么?我不是试图解决Order-OrderDetail问题或解决任何问题。我正在尝试学习并了解何时使用单个查询但重复数据或仅需要数据但多次查询。
答案 0 :(得分:1)
对于ORM,单个一对多查询非常简单。当你需要进行几个相互关联的一对多查询时,性能考虑开始让自己知道。
答案 1 :(得分:1)
始终衡量特定情况的效果。如果订单表具有很小的列,那么在一次往返中获得所有数据可能会更好。如果订单表有太多或blob列,则发出2个单独的查询可能会胜过。
答案 2 :(得分:0)
使用EntityFramework
,您应该致电Include
context
var order = context.Orders.Include(x => x.Details).First(x => x.Id == orderId);