53

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

谢谢

4

2 回答 2

73

IQueryable

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

IEnumerable

  • 仅转发的项目列表。如果不通过第 0-3 项,您将无法获得“第 4 项”。
  • 只读列表,不能添加或删除。
  • 仍然可能使用延迟执行(IQueryable 仍然是 IEnumerable)。

IList

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

ICollection

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

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

于 2012-07-03T08:41:50.507 回答
2

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

于 2018-01-03T14:48:16.363 回答