簡體   English   中英

EF ICollection Vs List Vs IEnumerable Vs IQueryable

[英]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 這意味着您仍然可以添加過濾器,例如Where()
  • 擴展IEnumerable

IEnumerable

  • 僅向前的項目列表。 如果沒有傳遞0-3項,你就無法進入“第4項”。
  • 只讀列表,您無法添加或刪除它。
  • 仍然可能使用延遲執行(IQueryable仍然是IEnumerable)。

IList

  • 隨機訪問完整列表
  • 可能完全在內存中(沒有延遲執行,但是誰知道實現這個的確切類是什么?)
  • 支持添加和刪除
  • 擴展IEnumerable和ICollection

ICollection

  • 在IEnumerable和IList之間。
  • 擴展IEnumerable

什么是“最好”取決於您的要求。 通常,如果您只想顯示項目,IEnumerable“足夠好”。 至少總是使用通用變體。

EF的另一個區別是IEnumerable沒有執行查詢到DB,直到您真正枚舉列表。 IList將執行查詢並獲取內存中的項目。 我有一個奇怪的緩存行為。 追逐IEnumarable並沒有存儲項目,而是存儲了未獲取的枚舉,每當我調用緩存並為某種目的獲取枚舉時,它將轉到數據庫並執行查詢,因此緩存是無用的。 但是枚舉上的ToList()獲取了項目並將項目存儲在緩存中,因此只有1次訪問數據庫。 在這篇文章中找到更多: http//www.dailycode.info/BlogV2/post/entityframework-adding-ienumerable-to-cache

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM