2011-06-30 31 views
1

有關EF的另一個問題:實體框架 - 幕後:數據讀取器和連接生命週期

我想知道在迭代查詢結果時幕後會發生什麼。

例如,請參閱下列代碼:

var activeSources = from e in entitiesContext.Sources 
        where e.IsActive 
        select e; 

然後:

foreach (Source currSource in allSources) 
{ 
    code based on the current source... 
} 

重要提示:每次迭代需要一段時間才能完成(從1至25秒)。

現在,我假設EF基於DataReaders以獲得最大效率,所以基於這一假設,我認爲在上述情況下,數據庫連接將保持打開狀態,直到完成迭代結果爲止,這將是很長一段時間(用代碼說話時),這是我顯然不想要的。

是否有一種方法來獲取整個數據,就像我用普通的舊ADO.NET DataAdapters,DataSet和fill()方法取代使用DataReaders一樣?

或者,也許我的方式與我的假設?

在任何情況下,如果可以的話,我都會喜歡指出一個很好的解釋。

感謝,

米奇

+0

「的ToList (IEnumerable的)方法強制立即查詢評估,並返回包含查詢results.You可以追加這個方法來查詢,以獲得查詢結果的緩存副本列表。 「 – Guillaume

+0

謝謝,感謝:) –

回答

3

如果你想獲得的所有數據的前面,類似於Fill(),你需要強制查詢執行。

var activeSources = from e in entitiesContext.Sources 
        where e.IsActive 
        select e; 

var results = activeSources.ToList(); 

在調用ToList()之後,您將擁有數據並與數據庫斷開連接。

+0

謝謝,我對DataReaders的假設是否正確?甚至接近那個? –

+0

@Mikey:在這一點上我其實不確定。我記得在閱讀EF時使用了LINQ-to-SQL,那麼問題會是如何實現的?我也會假設'DataReader',但不能確認。通常@Ladislav和@Slauma對這些主題有很好的輸入。 – Yuck

+1

EF不使用Linq-to-SQL - 它基於ADO.NET完全獨立實現數據訪問,它確實使用數據讀取器。這個假設是正確的。如果你迭代結果集,閱讀器必須保持打開狀態。 –

1

如果要一次返回所有結果,請使用.ToList();然後延遲執行不會發生。

var activeSources = (from e in entitiesContext.Sources 
       where e.IsActive 
       select e).ToList(); 
+0

@Jethro:我認爲你的意思是*推遲執行*。延遲加載是完全不同的主題,涉及何時實現相關實體。 – Yuck

+0

這不是延遲加載 - 它代表不同的功能。這稱爲延期執行。 –

+0

哦,是延遲執行,嗯,他們不是很相似,但?差不多一樣? – Jethro