2010-09-23 135 views
15

因此,我建議幾次禁用惰性加載時構建應用程序與上述框架,並且ToList()將強制執行我的存儲庫中的查詢。我被告知如果使用AsEnumerable(),我會避免使用某些「陷阱」。然而,在最近的一個問題中,我在我的代碼示例中包含了一堆ToList(),並且讓很多人確信IEnumerable返回的結果要好得多。ASP.NET MVC2與實體框架4 - 存儲庫中的AsEnumerable()或ToList()?

我現在徹底困惑,至少可以說。

我應該在我的存儲庫中返回IEnumerable,然後將它們轉換爲我的視圖模型中的List?我是否應該像以前一樣在存儲庫中直接使用ToList()?我是否想要首先啓用延遲執行?

吉米尼聖誕...

編輯: 所以,是,我禁用延遲加載,基於前面的建議,我應該再重新啓用它,從我的倉庫返回的IEnumerable/IQueryable的,並轉換在我的視圖模型中收集到一個List,如果需要?

下面的答案之一將IEnumerable與急切的執行聯繫起來,而我的印象是隻有ToList()會強制立即執行查詢。

我偶然發現了this,thisthis,這些都包含了一些與這個問題有關的有趣討論。

回答

16

呼叫ToList(),在你的倉庫返回一個IEnumerable,如果:

  1. 你想控制提供給消費者(即你不想讓他們運行的查詢就可以了)的輸出設定,並且
  2. 你不介意急切的執行。

返回IQueryable,或通過IEnumerableAsEnumerable(),在你的資料庫,如果:

  1. 你不介意你的消費者對輸出設定運行的查詢,並
  2. 你要延遲執行。

請參見
http://thinkbeforecoding.com/post/2009/01/19/Repositories-and-IQueryable-the-paging-case

+0

我想我的問題的一部分,包括我是否應該被強制執行的渴望與框架的給定組合,如一些人所建議。 – asfsadf 2010-09-23 04:09:34

+0

除了我已經提到的因素之外,強制急切的執行可能實際上會導致性能問題;即使消費者實際上並不需要所有數據,整個數據集也會一次返回。 – 2010-09-23 04:11:51

+0

有趣的文章。謝謝。 – asfsadf 2010-09-23 04:13:11