2010-09-23 137 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