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

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

谢谢

IQueryable

  • 查询不会执行,直到你真的迭代的项目,可能通过做一个.ToList()或一个foreach 。 这意味着你仍然可以添加filter,比如Where()
  • 扩展IEnumerable

IEnumerable

  • 只转发项目列表。 没有通过0-3的项目,你不能得到“项目4”。
  • 只读列表,您不能添加或删除它。
  • 仍然可以使用延迟执行(IQueryable仍然是一个IEnumerable)。

IList

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

ICollection

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

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