簡體   English   中英

與SQL相比,EF Linq QUery原因鎖定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM