2010-01-14 265 views
4

使用實體框架,當一個執行一個查詢就可以說,2000條記錄需要GROUPBY和其他一些計算,並查詢獲取服務器上執行,只有結果發送到客戶端或爲它全部發送到客戶端,然後執行?實體框架的SQL查詢執行

這使用SQL Server。

我尋找到這一點,因爲我將要開始一個項目,將有一個巨大的數據庫需要查詢的負載,想知道這是否會在網絡上產生一個顯著的負載,如果用實體框架。

+0

這要看!你可以發佈一些代碼嗎? – 2010-01-14 15:11:22

+0

我現在還不能發佈任何代碼,因爲這是我開始這個項目之前的研究。 – 2010-01-14 15:20:27

回答

3

我認爲所有的數據庫查詢都是在服務器端完成的(數據庫在哪裏!),並且結果被傳遞過來。然而,在Linq中,您有所謂的Delayed Execution(延遲加載),因此您的信息在您嘗試訪問它之前不會實際檢索到,例如調用ToList()或訪問屬性(相關表)。

如果您需要,您可以選擇使用LoadWith進行急切加載。

因此,就性能而言,如果您只是真的想爲您的查詢(其中有相關表格)進行數據庫訪問1次,那麼我會建議使用LoadWith選項。但是,這確實取決於具體情況。

+0

它被稱爲延期執行 – 2010-01-14 15:18:00

+0

我認爲它通常被稱爲兩個... – James 2010-01-14 15:20:41

+1

而不是使用LoadWith,您可以使用投影。查看http://stackoverflow.com/questions/1085462/conditional-include-in-linq-to-entities/1164175#1164175例如 – 2010-01-14 15:46:56

3

它總是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。

2

好,我有同樣的問題,前一段時間。 基本上:你的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(); 
+0

調用'.ToList'或其他需要獲得結果以完成的事情,會導致查詢被評估。就像通過IEnumerable/IQueryable進行foreach一樣。 – 2010-01-14 15:44:55

+0

這就是要點......這就是你如何寫你的陳述......;) – 2010-01-14 17:14:05

3

的Sql的GROUPBY和LINQ的GROUPBY返回不同形狀的結果。

的Sql的GROUPBY返回鍵和聚集物(無組成員)

的LINQ的GROUPBY返回鍵和組成員。

如果您使用這些組成員,他們必須(重新)由分組鍵獲取。這可以結果+1數據庫往返每組

+0

如果你沒有發現它,這可能毀了你的表現。 – cjk 2010-01-14 15:20:38