回答
當您開始迭代集合時,延遲加載會加載整個集合。例如:假設user
1具有作用 「基於role1」, 「role2所」, 「Role3」(user.Roles
是virtual
):
var user = context.Users.Single(u => u.Id == 1);
foreach (var role in user.Roles) // DB query happens here once
{
Console.WriteLine(role.Name);
if (role.Name == "Role1")
break;
}
雖然你從來沒有訪問Role2
和Role3
他們已經加載仍然。
它每次遍歷源枚舉時迭代遍歷投影。
@ Slauma的答案是正確的 - 當導航屬性第一次被訪問時,整個集合被加載。它必須採用「正常」導航屬性的方式,因爲該集合只是常規ICollection而不是IQueryable <>。
但是,如果您不希望加載整個集合,則可以執行兩項操作。如果你有一個可用的上下文,那麼你可以使用Query方法真正地加載懶惰。例如:
foreach (var role in context.Entry(user).Collection(e => e.Roles).Query())
{
Console.WriteLine(role.Name);
if (role.Name == "Role1")
break;
}
如果您事先知道要查找哪個實體,則可以稍微多加一些。例如,只需加載role1上你可以這樣做:
var role1 = context.Entry(user)
.Collection(e => e.Roles)
.Query()
.Single(r => r.Name == "Role1");
這篇文章提供的查詢方法,一些細節:
如果你想使這更transaprent這樣你不「T需要上下文中運行查詢時可用,然後檢查這些博客文章,介紹如何賺更多的懶惰集合:
http://blog.oneunicorn.com/2011/03/28/extra-lazy-collection-count-with-ef-4-1-part-1/
和更普遍的IQueryable支持的集合:
http://blog.oneunicorn.com/2011/03/30/a-more-general-queryable-collection/
我也發現我的答案是錯誤的一些更多的測試。我想,對懶惰加載部分的太多的一廂情願的想法。好的解釋方式。 – 2012-02-26 21:50:26
你的第一個例子在DB查詢方面會做什麼?它會在每次迭代中爲單個角色生成一個查詢嗎?我實際上已經預料到,當你開始迭代時,只有一個針對* all *角色的查詢。嗯,有趣... – Slauma 2012-02-27 10:19:25
- 1. JSON.NET和nHibernate延遲加載集合
- 2. 延遲加載
- 3. 延遲加載
- 4. 延遲加載
- 5. NSFileWrapper是否支持延遲加載?
- 6. URLClassLoader是否使用延遲加載?
- 7. 什麼是延遲加載?
- 8. 加載時的延遲Default.png
- 9. 當窗體加載時延遲加載組合框
- 10. 線程安裝延遲加載時,加載可能會失敗
- 11. 延遲加載3.2.6
- 12. nhibernate延遲加載
- 13. 延遲加載MirrorType
- 14. RecyclerView延遲加載
- 15. 延遲加載DLL
- 16. Firebase延遲加載
- 17. UIwebview延遲加載
- 18. 延遲加載CollectionViewSource?
- 19. Laravel延遲加載
- 20. Firebase延遲加載
- 21. gwt延遲加載
- 22. 延遲加載XmlDocument
- 23. 延遲加載MEF?
- 24. 實體框架延遲加載的集合有時空
- 25. 延遲加載在highcharts
- 26. 在node.js中延遲加載
- 27. 在c#中延遲加載?
- 28. 在延遲加載EF
- 29. 隱式延遲加載vs顯式延遲加載
- 30. 實體框架不延遲加載FK集合添加
請張貼一些代碼。 – jrummell 2012-02-24 21:28:47
'ObjectContext'有一個'ObjectMaterialized'事件。你可以聽取這個事件,當你迭代一個集合來找出。 – cadrell0 2012-02-24 21:35:21
@Alex Ford,您對IEnumerable的某些特定情況(實體框架)或一般情況感興趣嗎?即對於一個IEnumerable實現來說,無論什麼時候,只要你問一個項目,都不會停下來獲取7個項目。 – 2012-02-24 22:57:14