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

asf*_*adf 15 linq asp.net asp.net-mvc entity-framework

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

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

我现在彻底困惑,至少可以说.

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

Jiminy圣诞节......

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

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

我偶然发现这个,这个这个,所有包含有关这一问题的一些有趣的讨论.

Rob*_*vey 16

如果出现以下情况,请在您的存储库中调用ToList(),IEnumerable

  1. 您希望控制提供给使用者的输出集(即您不希望它们对其运行查询),以及
  2. 你不介意急切的执行.

如果出现以下情况,请返回IQueryableIEnumerable通过AsEnumerable()存储库:

  1. 您不介意您的消费者在输出集上运行查询,并且
  2. 您想要延期执行.

另见
http://thinkbeforecoding.com/post/2009/01/19/Repositories-and-IQueryable-the-paging-case

  • 我认为如果某些东西实现了`IQueryable <T>`并且你把它作为`IEnumerable <T>`返回`底层对象仍然是`IQueryable <T>`因此保留延迟执行等...?因此返回`IList <T>`的原因. (2认同)