关于c#:EF ICollection Vs List Vs IEnumerable Vs IQueryable

EF ICollection Vs List Vs IEnumerable Vs IQueryable

所以,我的ef模型有关系,根据我在示例中看到的,这些关系应该用iCollection的虚拟属性来完成。

例子:

1
2
3
4
5
6
 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,列表?我是,我是,我是回忆?

谢谢


IQueryable

  • 查询的执行,直到你真的是不是在iterate也许通过做项目,foreach.ToList()或。你还可以添加其均值滤波器,Where()一样。
  • 扩展IEnumerable

IEnumerable

  • 前一项目的列表。你能不能把"不合格项(4项"0 - 3。
  • 只读列表,你不能添加或删除它从它。
  • 使用延迟执行(iqueryable仍然可能仍然是一个IEnumerable)。

IList

  • 随机访问的完整列表
  • 完全可能(在内存中的延期执行,但谁知道这类的实现),这样做的吗?)
  • 支持添加和删除
  • 扩展IEnumerable和ICollection

ICollection

  • ilist IEnumerable和IS之间。
  • 扩展IEnumerable

什么是"最好的"取决于你的需求。虽然通常是一个IEnumerable的"足够好"如果你只想显示的项目。遗传变异在总最小二乘使用。


在另一个差分情况下,EF是IEnumerable不是自动执行查询的数据库,除非你真的枚举列表。而ilist将运行查询和读取内存中的项目。我有一个奇怪的行为与缓存。在ienumarable didn’t chaching店而unfetched列举的项目,我会在每一次调用的枚举和读取缓存的一些用途,它会去和运行数据库查询操作系统缓存,是无用的。但tolist(枚举)的项目的项目存储在读取和高速缓存系统中,仅在1 dB的去为这个。找到更多的在这个帖子:http://///blogv2 www.dailycode.info后加entityframework IEnumerable到缓存。