[英]EF Linq QUery cause lock compared to SQL
我有一個使用LINQ和EF的簡單計數查詢:
var count = (from I in db.mytable
where xyz
select I).Count();
上面的代碼顯示查詢已鎖定在數據庫中。
而execute sql立即執行:
var count = db.SqlQuery<int>("select count(*) from mytable where xyz").FirstOrDefault();
上面的代碼立即返回。
我很少建議刪除.ToList(),但沒有區別。 一件事是,這僅發生在PROD服務器上。 質量檢查服務器執行得非常快。 但是生產服務器顯示它已被掛起。 我懷疑這可能是數據存儲限制或服務器相關。 但是要確保我沒有在代碼中做一些愚蠢的事情。
更新:
我注意到的一件事是,它第一次執行需要更長的時間。 當我設置下一條語句再次運行時,它立即執行。 第一次有查詢編譯嗎?
因為您在第一個查詢中調用ToList
,這將導致從DB中獲取所有記錄並在內存中進行計數。 除了ToList
您只需調用Count()
即可獲得相同的行為:
var count = (from I in db.mytable
where xyz
select I).Count();
您不得調用.ToList()
方法,因為您開始從數據庫中檢索所有對象。 只需調用.Count()
var count = (from I in db.mytable
where xyz
select I).Count();
計數可以使用謂詞。 我不確定它是否會加快代碼的速度,但是您可以這樣寫計數。
var count = db.mytable.Count(x => predicate);
where謂詞是您在where子句中要測試的內容。
LINQPad中的簡單擺弄顯示這將生成與上述類似(如果不完全相同)的SQL。 就代碼簡潔而言,這是最簡單的方法,我知道該怎么做。
如果您需要的速度比EF所提供的速度高得多,而又不使用內聯SQL來限制EF的范圍,則可以創建一個存儲過程並從EF調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.