.net 性能:导航道具。VSSQL查询

.net 性能:导航道具。VSSQL查询,.net,entity-framework,lazy-loading,.net,Entity Framework,Lazy Loading,假设我们有类项目,有许多冲刺 项目具有i集合。 我想选择并分页这些sprint,然后从Web应用程序返回给用户 我可以用这种方式选择:project.sprint.Skip(…).Take(…) 或 用这种方式进行冲刺。其中(x=>x.ProjectId==some\u ProjectId)。跳过(…)。采取(…) 我想了解选择和分页ICollection作为导航属性和作为IQueryable之间的性能差异 我认为第一种方式并不好,因为所有的冲刺都是在内存中迭代的 如果桌上有许多冲刺,那么第二种

假设我们有
类项目
,有许多
冲刺

项目
具有
i集合
。 我想选择并分页这些
sprint
,然后从Web应用程序返回给用户

我可以用这种方式选择
project.sprint.Skip(…).Take(…)

用这种方式进行冲刺。其中(x=>x.ProjectId==some\u ProjectId)。跳过(…)。采取(…)

我想了解选择和分页
ICollection
作为导航属性和作为
IQueryable
之间的性能差异

我认为第一种方式并不好,因为所有的冲刺都是在内存中迭代的 如果桌上有许多
冲刺
,那么第二种方法可能会慢一些(而且看起来不太明显)

但是你怎么想呢

另外,我使用的是实体框架6.0.1 codefirst。
谢谢你的时间

有一个很大的区别。当您使用导航属性时,当您尝试访问该属性时,将加载所有相关实体

project.Sprints.Skip(...).Take(...)
因此,这里所有的sprint都加载在一个查询中,分页将在内存中进行。获取下一页将查询内存中sprint集合中项目所持有的内容。数据库将不再被攻击。但是你的第二种方法

sprints.Where(x => x.ProjectId == some_projectId).Skip(...).Take(...)
分页将发生在服务器端,每次加载下一页时都会点击数据库


选择哪种方法取决于sprint的总数、需要下载的数据量以及每页的sprint。它还取决于您正在构建的应用程序的类型。如果它是web应用程序,并且您不能在请求之间存储
project
对象,那么您可以选择服务器端分页(第二个选项)。如果您的
Sprint
是一个轻量级对象,并且这些对象的数量不是很大,那么一次下载就有意义了。没有适合所有情况的解决方案。

谢谢,现在我对选择什么毫无疑问(第二种方式)