EF ICollection Vs List Vs IEnumerable Vs IQueryable



因此,我的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 将在那个时刻执行,而不是在我调用 .在网页中。

那么,最佳实践是什么? 我应该退货什么?IEnumerable, List?, IList, ICollection?

感谢

IQueryable

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

IEnumerable

  • 项目仅进列表。如果不传递项目 0-3,则无法获得"项目 4"。
  • 只读列表,您无法向其添加或从中删除。
  • 仍然可能使用延迟执行(IQueryable 仍然是 IEnumerable)。

IList

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

ICollection

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

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

EF 的另一个区别是,在您真正枚举列表之前,IEnumerable 不会对数据库执行查询。而 IList 将执行查询并获取内存中的项目。我在缓存方面有一个奇怪的行为。Chaching IEnumarable 不存储项目,而是存储未提取的枚举,每次我调用缓存并出于某种目的获取枚举时,它都会转到数据库并执行查询,因此缓存毫无用处。但是枚举上的 ToList() 获取项目并将项目存储在缓存中,因此为此只需 1 次访问数据库。在这篇文章中了解更多信息: http://www.dailycode.info/BlogV2/post/entityframework-adding-ienumerable-to-cache

最新更新