我正在构建一个基本的MVC Core Web API并尝试使用Entity Framework进行连接,我遇到了一个名为“Lazy Loading”的东西,我似乎无法理解Lazy Loading是如何旋转EntityFramework的?
何时使用延迟加载以及它如何受益?
答案 0 :(得分:3)
在我看来,延迟加载是从数据库自动加载实体或实体集合的过程。
实际上,排序和检索算法正在用户端应用,而查询获取所有数据。默认情况下,延迟加载功能为ON,但可以手动关闭,或者您可以构建聪明的查询,即使用IQueryable,它在服务器端进行过滤并仅检索所需的那些记录。在实践中,它可以帮助您节省大量时间和资源,防止流量过大和服务器过载
本网站提供更好的答案 - > https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
答案 1 :(得分:1)
延迟加载意味着延迟加载相关数据,直到您特别请求它为止。例如,Student
类包含StudentAddress
作为复杂属性。因此,上下文首先从数据库加载所有students
,然后在我们访问student
属性时加载特定StudentAddress
的地址,如下所示。
using (var ctx = new SchoolDBEntities())
{
//Loading students only
IList<Student> studList = ctx.Students.ToList<Student>();
Student std = studList[0];
//Loads Student address for particular Student only (seperate SQL query)
StudentAddress address = std.StudentAddress;
}
上面显示的代码将导致两个SQL查询。首先,它将获取所有students
:
SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[StudentName] AS [StudentName],
[Extent1].[StandardId] AS [StandardId]
FROM [dbo].[Student] AS [Extent1]
然后当控制到达以下行时:
StudentAddress address = std.StudentAddress;
EF会将第二个查询发送到db以加载StudentAddress
:
exec sp_executesql N'SELECT
[Extent1].[StudentID] AS [StudentID],
[Extent1].[Address1] AS [Address1],
[Extent1].[Address2] AS [Address2],
[Extent1].[City] AS [City],
[Extent1].[State] AS [State]
FROM [dbo].[StudentAddress] AS [Extent1]
WHERE [Extent1].[StudentID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1
延迟加载规则:
context.Configuration.ProxyCreationEnabled
应该是真的。context.Configuration.LazyLoadingEnabled
应该是真的。导航public
,virtual
。上下文不会这样做
如果属性未定义为虚拟属性,则延迟加载(在这种情况下,StudentAddress
应为virtual
)。答案 2 :(得分:-1)
我在我的一个项目中使用了延迟加载来解决分页问题,例如,一次调用就从区块链加载所有数据花费了很多时间,所以我在页面加载时仅加载了10/20条记录,并且用户向下滚动页面以获取下一个10/20条记录。