EF ICollection Vs List Vs IEnumerable Vs IQueryable

问题描述 投票:45回答:2

所以,我的EF模型有关系,根据我在例子中看到的,这些关系应该用ICollection的虚拟属性来完成。

例:

 public class Task
    {
        public int Id { get; set; }
        public string Description { get; set; }
        public virtual ICollection<SubTask>  { get; set; }
    }

我在某处读到了我应该使用IEnumerable来防止延迟执行,这是正确的吗?这意味着如果我的DAL方法返回IEnumerable,仍然是IQueryable,那么SQL将在那一刻执行,而不是在我在网页中调用.TOList时。

那么,最佳做法是什么?我该怎么回事? IEnumerable,List?,IList,ICollection?

谢谢

c# entity-framework entity-framework-4 entity-framework-4.1
2个回答
62
投票

IQueryable

  • 在您真正迭代项目之前,可能不会执行查询,可能是通过执行.ToList()foreach。这意味着您仍然可以添加过滤器,例如Where()
  • 扩展IEnumerable

IEnumerable

  • 仅向前的项目列表。如果没有传递0-3项,你就无法进入“第4项”。
  • 只读列表,您无法添加或删除它。
  • 仍然可能使用延迟执行(IQueryable仍然是IEnumerable)。

IList

  • 随机访问完整列表
  • 可能完全在内存中(没有延迟执行,但是谁知道实现这个的确切类是什么?)
  • 支持添加和删除
  • 扩展IEnumerable和ICollection

ICollection

  • 在IEnumerable和IList之间。
  • 扩展IEnumerable

什么是“最好”取决于您的要求。通常,如果您只想显示项目,IEnumerable“足够好”。至少总是使用通用变体。


1
投票

EF的另一个区别是IEnumerable没有执行查询到DB,直到您真正枚举列表。 IList将执行查询并获取内存中的项目。我有一个奇怪的缓存行为。追逐IEnumarable并没有存储项目,而是存储了未获取的枚举,每当我调用缓存并为某种目的获取枚举时,它将转到数据库并执行查询,因此缓存是无用的。但是枚举上的ToList()获取了项目并将项目存储在缓存中,因此只有1次访问数据库。在这篇文章中找到更多:http://www.dailycode.info/BlogV2/post/entityframework-adding-ienumerable-to-cache

© www.soinside.com 2019 - 2024. All rights reserved.