2010-05-13 79 views
2

我有一個愚蠢的問題。我想知道是否有這兩個查詢之間的性能差異:LINQ實體查詢性能

var cObject = from cust in entities.Customer 
       where cust.id == cid 
       select cust; 

var cObject = entities.Customer.First(c=> c.id == cid); 

我查詢的回報,因爲我與主鍵查詢只有一個記錄。但他們有什麼區別?

+0

您的第一行代碼不會執行任何SQL。第二個呢。所以是的,會有區別的。 – 2010-05-13 14:30:51

+0

@Craig:DataContext是否必須執行*某種* SQL來檢索記錄? – 2010-05-13 14:41:25

+0

它確實會列舉結果。但第一行不這樣做。 – 2010-05-13 14:49:01

回答

3

表現明智,它們應該是相似的。

類型明智,他們雖然不同。第一個返回一個 IEnumerable 帶有單個元素的IQueryable對象。第二個實際返回一個Customer對象。

+0

嚴格來說,第一行返回'IQueryable'。但是,如果人們認爲最終有人會真正關注查詢,這通常是正確的。 – 2010-05-13 15:30:52

0

沒有表現。

首先微軟推出

var cObject = entities.Customer.First(c=> c.id == cid); 

編輯:返回IQueryable

然後,他們加了糖給它,使工作變得容易是

var cObject = from cust in entities.Customer 
      where cust.id == cid 
     select cust; 

編輯返回customer object

+0

這就是我的想法,但看到賈斯汀的答案張貼在這裏 – 2010-05-13 14:54:36

+0

我知道,當我計劃編輯權力已經沒有..所以.. 任何方式謝謝 – anishMarokey 2010-05-13 16:00:15

1

如果您LINQ提供商sup移植「單個記錄查詢」的概念,那麼使用First的查詢可能會稍微快一點。

請注意,您可以使用第一個,然後執行cObject.First()以獲得相同的效果。

1

克雷格斯頓茨關於該問題的評論所指出的,你必須要小心剖析LINQ的代碼,因爲延遲加載延遲執行會扭曲你的分析結果。

要獲得清晰的閱讀,您必須致電ToList()強制查詢完全執行,然後您必須對第二個示例執行相同的操作,以使其成爲蘋果。

無論如何,第二個查詢被重寫爲返回 IEnumerable IQueryable與一個客戶對象而不是單個客戶對象,這兩個語句在功能上是相同的。