ASP.NET MVC2与实体框架4 - 存储库中的AsEnumerable()或ToList()?

时间:2010-09-23 03:52:02

标签: asp.net asp.net-mvc linq entity-framework

因此,在构建具有上述框架的应用程序时,我已经被建议几次禁用延迟加载,并且ToList()将强制执行我的存储库中的查询。有人告诉我,如果我使用AsEnumerable(),我会避免遇到某些“陷阱”。

然而,在最近的一个问题中,我在我的代码示例中包含了一堆ToList(),并且让很多人放心,确保IEnumerable更好回归。

至少可以说,我现在很困惑。

我应该在我的存储库中返回IEnumerable,然后在我的视图模型中将它们转换为List吗?我应该像以前一样在我的存储库中直接使用ToList()吗?我是否想首先启用延迟执行?

Jiminy圣诞节......

修改 因此,基于之前的建议,我禁用了延迟加载,我是否应该重新启用它,从我的存储库返回IEnumerable / IQueryable,并在需要时将集合转换为视图模型中的List?

以下答案之一将IEnumerable与急切执行相关联,而我的印象是只有ToList()会强制立即执行查询。

我偶然发现了thisthisthis,其中包含了与此问题相关的一些有趣的讨论。

1 个答案:

答案 0 :(得分:16)

调用ToList(),在您的存储库中返回IEnumerable,如果:

  1. 您想要控制提供给消费者的输出集(即您不希望它们对其运行查询),并且
  2. 你不介意急切执行。
  3. 如果符合以下条件,请在您的存储库中通过IQueryable返回IEnumerableAsEnumerable()

    1. 您不介意您的消费者在输出集上运行查询,
    2. 您想要延期执行。
    3. 另见
      http://thinkbeforecoding.com/post/2009/01/19/Repositories-and-IQueryable-the-paging-case