EF ICollection Vs List Vs IEnumerable Vs IQueryable

时间:2012-07-03 08:29:23

标签: c# entity-framework entity-framework-4 entity-framework-4.1

所以,我的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?

THX

2 个答案:

答案 0 :(得分:62)

IQueryable

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

IEnumerable

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

IList

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

ICollection

  • 介于IEnumerable和IList之间。
  • 扩展IEnumerable

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

答案 1 :(得分:1)

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