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

具有实体框架4的ASP.NET MVC2-存储库中的AsEnumerable()或ToList()?,asp.net,asp.net-mvc,linq,entity-framework,Asp.net,Asp.net Mvc,Linq,Entity Framework,因此,有几次建议我在使用上述框架构建应用程序时禁用延迟加载,并且ToList()将强制执行存储库中的查询。有人告诉我,如果我使用AsEnumerable(),我将避免可能遇到的某些“陷阱” 然而,在最近的一个问题上,我在代码示例中包含了一堆ToList(),这让许多人大吃一惊,他们向我保证IEnumerable更适合返回 至少可以说,我现在完全糊涂了 我是否应该在我的存储库中返回IEnumerable,然后将它们转换为视图模型中的列表?我应该像以前一样在存储库中直接使用ToList()吗?我是否

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

然而,在最近的一个问题上,我在代码示例中包含了一堆ToList(),这让许多人大吃一惊,他们向我保证IEnumerable更适合返回

至少可以说,我现在完全糊涂了

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

吉米尼圣诞节

编辑: 因此,既然我根据前面的建议禁用了延迟加载,那么我是否应该重新启用它,从存储库返回IEnumerable/IQueryable,并在需要时将集合转换为视图模型中的列表

下面的一个答案将IEnumerable与急切执行联系起来,而我的印象是只有ToList()会强制立即执行查询

我偶然发现,所有这些都包含一些与此问题相关的有趣讨论。

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

  • 您希望控制提供给消费者的输出集(即,您不希望他们对其运行查询),并且
  • 你不介意急于执行
  • 在以下情况下,通过存储库中的
    AsEnumerable()
    返回
    IQueryable
    ,或
    IEnumerable

  • 您不介意您的消费者在输出集上运行查询,并且
  • 你想要延期执行
  • 另请参见

    我想我的部分问题包括是否应该像一些人建议的那样,使用给定的框架组合强制执行急切执行。除了我已经提到的因素外,强制执行急切执行实际上可能会导致性能问题;整个数据集一次返回,即使使用者可能实际上并不需要所有数据。除了排序和分页之外,
    IQueryable
    允许您投影到演示模型上,而无需担心加载策略。我认为如果某个东西实现了
    IQueryable
    ,并且您将其作为
    IEnumerable
    返回,那么底层对象仍然是
    IQueryable
    ,因此保留了延迟执行等等。。。?因此需要返回
    IList
    。我知道
    IEnumerable
    不是
    IQueryable
    ,我只是指出仅仅返回
    IEnumerable
    是不够的。您的编辑确实清除了它,尽管我要补充的是,
    AsEnumerable()
    不是必需的,请参见
    IQuerable
    已经从
    IEnumerable
    继承的内容。