2014-11-03 78 views
0

在一對多關係的情況下,哪一個有更好的表現。選擇一對多哪一個更好

1的方法

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; 
} 

點,我想弄清楚(在性能方面),在第一種方式有單查詢,但重複數據正在在第二種方法中選擇哪裏有兩個單獨的查詢,但只選擇足夠的數據。

你可以假設OrdersOrderDetails是的EntityFramework(dbContext.Set<T>())或NHibernate的(session.Query<T>())的IQueryable<T>。我嘗試了兩個,他們創建了非常相似的SQL查詢。據我所知,這些ORM內置的一對多查詢使用類似於第一種方法的東西。

更新,澄清我問:哪一個(單個查詢,但重複的數據或只需要的數據,但多個查詢)在哪些情況下表現更好?可能有很多我可能沒有想到的情況。這就是爲什麼我不嘗試基準測試。正如在某些答案中已經指出的那樣,列數或更多聯接是我預期的答案種類。 (可能還有一些關於表格和/或結果集的行計數)。基於這些答案,我可以嘗試基準測試。當然,我在問爲什麼?我沒有試圖解決Order - OrderDetail問題或者解決任何問題。我試圖學習和了解何時使用單個查詢,但是重複數據或只需要數據但多個查詢。

+0

像往常一樣,有關哪個替代方案表現更好的問題只能由提問者回答。有時候一個查詢更快,有時兩個。我們不知道。 – 2014-11-03 22:19:22

回答

1

單個一對多查詢對於ORM非常簡單。當你需要做出幾個相互關聯的一對多查詢時,性能考慮開始使自己知道。

0

使用EntityFramework,你應該調用Includecontext

var order = context.Orders.Include(x => x.Details).First(x => x.Id == orderId); 

Loading Related Objects

+0

謝謝,但我已經知道建立在一對多的支持和導航屬性等現在我只是有興趣比較這兩種方法的性能。 – 2014-11-03 17:47:24

+0

@MehmetAtaş - 你是否嘗試過兩種方法的基準測試? – Aducci 2014-11-03 18:01:05

1

總是衡量你的特殊情況下的性能。如果訂單表具有少量小型列,則在一次往返中獲取所有數據可能會更好。如果訂單表的列數太多或blob,發出2個單獨的查詢可能會超出。