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总是使用通用变体。