[英]Selecting one to many which one is better
在一對多關系情況下,以下哪個具有更好的性能。
第一種方法
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
是EntityFramework的IQueryable<T>
( dbContext.Set<T>()
)或NHibernate( session.Query<T>()
)。 我嘗試了兩者,它們創建了非常相似的sql查詢。 據我所知,這些內置在一對多查詢中的ORM使用的是第一種方法。
更新,以澄清我要問的問題:哪種情況(單個查詢但重復的數據或僅必需數據但多個查詢)在哪種情況下效果更好? 我可能沒有想到很多情況。 這就是為什么我不嘗試進行基准測試。 正如某些答案中已經提到的那樣,列計數或更多的聯接是我期望的那種答案。 (關於表和/或結果集的行數可能也有一些問題)。 基於這些答案,我可以嘗試進行基准測試。 當然,我在問為什么? 我不嘗試解決Order-OrderDetail問題或根本不解決任何問題。 我正在嘗試學習和理解何時使用單個查詢但重復數據或僅使用必需數據但使用多個查詢。
對於ORM,單個一對多查詢非常簡單。 當您需要進行幾個相互關聯的一對多查詢時,性能方面的注意事項才開始廣為人知。
始終衡量您的特定情況下的效果。 如果訂單表的列數很少,那么一次往返獲取所有數據可能會更好。 如果訂單表中的列過多或不完整,則發出2個單獨的查詢的結果可能會更好。
使用EntityFramework
,您應該在context
上調用Include
var order = context.Orders.Include(x => x.Details).First(x => x.Id == orderId);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.