因此,我的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