延迟加载示例?

时间:2016-11-09 03:30:28

标签: c# entity-framework

我正在构建一个基本的MVC Core Web API并尝试使用Entity Framework进行连接,我遇到了一个名为“Lazy Loading”的东西,我似乎无法理解Lazy Loading是如何旋转EntityFramework的?

何时使用延迟加载以及它如何受益?

3 个答案:

答案 0 :(得分:3)

在我看来,延迟加载是从数据库自动加载实体或实体集合的过程。

实际上,排序和检索算法正在用户端应用,而查询获取所有数据。默认情况下,延迟加载功能为ON,但可以手动关闭,或者您可以构建聪明的查询,即使用IQueryable,它在服务器端进行过滤并仅检索所需的那些记录。在实践中,它可以帮助您节省大量时间和资源,防止流量过大和服务器过载

本网站提供更好的答案 - > https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

答案 1 :(得分:1)

来自entityframeworktutorial网站:

延迟加载意味着延迟加载相关数据,直到您特别请求它为止。例如,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应该是真的。导航
  • 属性应定义为publicvirtual。上下文不会这样做 如果属性未定义为虚拟属性,则延迟加载(在这种情况下,StudentAddress应为virtual)。

答案 2 :(得分:-1)

我在我的一个项目中使用了延迟加载来解决分页问题,​​例如,一次调用就从区块链加载所有数据花费了很多时间,所以我在页面加载时仅加载了10/20条记录,并且用户向下滚动页面以获取下一个10/20条记录。