如果我有以下代碼,編譯器是否實例化每個結果,還是足夠明智地統計表中有多少條對應記錄?如果不是,它可能會迫使我在較大的查詢中使用不同的策略。LINQ優化問題
from c in context.RendezVous
where c.RepID == repID &&
c.DateHeureRV != null &&
c.DateHeureRV.Value.Date == date.Date
select c).Count();
謝謝!
如果我有以下代碼,編譯器是否實例化每個結果,還是足夠明智地統計表中有多少條對應記錄?如果不是,它可能會迫使我在較大的查詢中使用不同的策略。LINQ優化問題
from c in context.RendezVous
where c.RepID == repID &&
c.DateHeureRV != null &&
c.DateHeureRV.Value.Date == date.Date
select c).Count();
謝謝!
這取決於context
的類型。
如果這是一個實體框架或LINQ to SQL查詢,並context
是IQueryable<T>
,那麼查詢被變成了一個SQL查詢服務器剛剛返回數作爲一個整數上。
如果這是一個內存中的集合(即:IEnumerable<T>
),則每個項目都按順序(Linq到Objects)迭代並計數。
我懷疑前者是真的,因爲你提到了「表」,並且你沒有使用LINQ to Dataset擴展方法。在這種情況下,你會保持非常高效。
如果源實現'ICollection
@CodeInChaos:在這種情況下,不會,因爲它必須查看將'ICollection
'的'.Where()'方法的結果(通常,你是對的 - 但是如果僅僅是'context.Count()'沒有where子句,那會更好) – 2011-06-01 18:06:06
這將執行一個SQL查詢,並列出您列出的三個WHERE條件並返回匹配行的計數,它只會實現實際計數而不是每行 - 如果這是您的問題。
原始問題中沒有提到SQL - 這可能全都在內存中。 – SethO 2011-06-01 17:58:00
那麼桌子上有5個或200個柱子會不會有效果? – Mathieu 2011-06-01 17:58:10
@SethO'context'和'table'這兩個詞表明這是數據庫支持的linq(linq-to-sql,linq-to-entities,...) – CodesInChaos 2011-06-01 18:05:35
這將執行(或多或少):
select count(*)
from rendezvous
where repid='...' and dateheurerv is not null and dateheurerv='...'
的LINQ將增加沒有真正的開銷,查詢和次數將被處理的服務器端。
LINQ只是懶懶地執行代碼,例如,只有當你試圖訪問它的元素。之前的每個表達式只是添加到LINQ查詢對象內部構建的動態表達式中。 – 2011-06-01 17:57:47
@Yet:然而,在這種情況下,'.Count()'會立即完全評估查詢... – 2011-06-01 17:58:16
@Reed,下次我使用它時很好。 – 2011-06-01 18:03:00