EF ICollection Vs List Vs IEnumerable Vs IQueryable
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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?
谢谢
- 在您真正迭代项目之前,可能不会执行查询,可能是通过执行
.ToList()
或foreach
。这意味着您仍然可以添加过滤器,例如Where()
。 - 扩展IEnumerable
- 仅向前的项目列表。如果没有传递0-3项,你就无法进入“第4项”。
- 只读列表,您无法添加或删除它。
- 仍然可能使用延迟执行(IQueryable仍然是IEnumerable)。
- 随机访问完整列表
- 可能完全在内存中(没有延迟执行,但是谁知道实现这个的确切类是什么?)
- 支持添加和删除
- 扩展IEnumerable和ICollection
- 在IEnumerable和IList之间。
- 扩展IEnumerable
什么是“最好”取决于您的要求。通常,如果您只想显示项目,IEnumerable“足够好”。至少总是使用通用变体。
EF的另一个区别是IEnumerable没有执行查询到DB,直到您真正枚举列表。 IList将执行查询并获取内存中的项目。我有一个奇怪的缓存行为。追逐IEnumarable并没有存储项目,而是存储了未获取的枚举,每当我调用缓存并为某种目的获取枚举时,它将转到数据库并执行查询,因此缓存是无用的。但是枚举上的ToList()获取了项目并将项目存储在缓存中,因此只有1次访问数据库。在这篇文章中找到更多:http://www.dailycode.info/BlogV2/post/entityframework-adding-ienumerable-to-cache
以上是关于EF ICollection Vs List Vs IEnumerable Vs IQueryable的主要内容,如果未能解决你的问题,请参考以下文章