使用實體框架,當一個執行一個查詢就可以說,2000條記錄需要GROUPBY和其他一些計算,並查詢獲取服務器上執行,只有結果發送到客戶端或爲它全部發送到客戶端,然後執行?實體框架的SQL查詢執行
這使用SQL Server。
我尋找到這一點,因爲我將要開始一個項目,將有一個巨大的數據庫需要查詢的負載,想知道這是否會在網絡上產生一個顯著的負載,如果用實體框架。
使用實體框架,當一個執行一個查詢就可以說,2000條記錄需要GROUPBY和其他一些計算,並查詢獲取服務器上執行,只有結果發送到客戶端或爲它全部發送到客戶端,然後執行?實體框架的SQL查詢執行
這使用SQL Server。
我尋找到這一點,因爲我將要開始一個項目,將有一個巨大的數據庫需要查詢的負載,想知道這是否會在網絡上產生一個顯著的負載,如果用實體框架。
我認爲所有的數據庫查詢都是在服務器端完成的(數據庫在哪裏!),並且結果被傳遞過來。然而,在Linq中,您有所謂的Delayed Execution(延遲加載),因此您的信息在您嘗試訪問它之前不會實際檢索到,例如調用ToList()或訪問屬性(相關表)。
如果您需要,您可以選擇使用LoadWith進行急切加載。
因此,就性能而言,如果您只是真的想爲您的查詢(其中有相關表格)進行數據庫訪問1次,那麼我會建議使用LoadWith
選項。但是,這確實取決於具體情況。
它被稱爲延期執行 – 2010-01-14 15:18:00
我認爲它通常被稱爲兩個... – James 2010-01-14 15:20:41
而不是使用LoadWith,您可以使用投影。查看http://stackoverflow.com/questions/1085462/conditional-include-in-linq-to-entities/1164175#1164175例如 – 2010-01-14 15:46:56
它總是SQL服務器上執行。這也意味着有時你必須要改變這種:
from q in ctx.Bar
where q.Id == new Guid(someString)
select q
到
Guid g = new Guid(someString);
from q in ctx.Bar
where q.Id == g
select q
這是因爲構造函數調用不能轉換爲SQL。
好,我有同樣的問題,前一段時間。 基本上:你的linq語句被轉換爲一個sql語句。然而:有些團體會被翻譯,有些則不會 - 這取決於您如何撰寫聲明。
所以是 - 既可以
例如:
var a = (from entity in myTable where entity.Property == 1 select entity).ToList();
與
var a = (from entity in myTable.ToList() where entity.Property == 1 select entity).ToList();
調用'.ToList'或其他需要獲得結果以完成的事情,會導致查詢被評估。就像通過IEnumerable/IQueryable進行foreach一樣。 – 2010-01-14 15:44:55
這就是要點......這就是你如何寫你的陳述......;) – 2010-01-14 17:14:05
的Sql的GROUPBY和LINQ的GROUPBY返回不同形狀的結果。
的Sql的GROUPBY返回鍵和聚集物(無組成員)
的LINQ的GROUPBY返回鍵和組成員。
如果您使用這些組成員,他們必須(重新)由分組鍵獲取。這可以結果+1數據庫往返每組。
如果你沒有發現它,這可能毀了你的表現。 – cjk 2010-01-14 15:20:38
這要看!你可以發佈一些代碼嗎? – 2010-01-14 15:11:22
我現在還不能發佈任何代碼,因爲這是我開始這個項目之前的研究。 – 2010-01-14 15:20:27