手机版

ASP.NET MVC开发的EF延迟加载

时间:2021-09-17 来源:互联网 编辑:宝哥软件园 浏览:

先看定义。

EF延迟加载:使用Lamabda表达式或Linq从EF实体对象查询数据时,EF不直接查询数据,而是在使用特定数据时加载到内存中。

1.实体对象的Where方法返回什么对象?

让我们看一下上一篇文章的代码来分析一下:

# region query article list action result article()///summary///query article list////summary///returns/returns public action result article(){//get article list db . blog articles . where through db对象(p=p . aisdel==false);//使用lambda表达式获取已删除的文章//使用lambda表达式获取数据//返回一个ListT对象来存储文章列表模型的列表。博客文章列表=db . blog articles . where(p=p . aisdel==false)。to list();//还可以使用Linq获取数据listmodels.blog article list1=(来自db.blog articles中的p,其中p.aisdel==false select p)。to list();//使用ViewData传递列表对象view data[' DataList ']=list;返回视图();} #endregion为了体验延迟加载,我们对代码进行了如下修改:

# region query article list action result article()///summary///query article list////summary///returns/returns public action result index(){//通过db对象获取文章列表db . bloclaarticles . where(p=p . aisdel==false);//使用Lamabda表达式获取删除的文章dbquerymodels。博客文章查询=(db . blog articles . where(p=p . aisdel==false))as dbquerymodels。博客文章;列表模型。BlogArticle list=查询。to list();//使用ViewData传递列表对象view data[' DataList ']=query;返回视图();} #endregion在这里,我们为什么要用DbQueryT来接收呢?

首先,让我们看看在使用db时,Where()方法返回给我们什么样的对象。获取文章列表的位置。在我们将鼠标放在Where()方法上之后,我们会发现Where将返回给我们一个IQueryable的通用接口对象,如下图所示:

我们需要使用IQueryable对象来接收获取的对象吗?代码如下:

//where()方法返回一个IQuery接口iqueryablemodels。blog article query=db . blog articles . where(p=p . aisdel==false);这里的查询能得到一个值吗?让我们运行调试程序,结果如下:

在局部变量窗口中,我们可以看到查询已经得到了值。但是,根据面向对象的原则,接口不能直接实例化,但是这里的代码不会报告错误。为什么呢?

根据面向对象的Richter替换原理,我们都知道这其实是IQueryable对象的一个子类。

注意:C# Richter替换原则,子类对象可以赋给父对象。也就是说,子类可以代替父类出现的地方。但是,父对象不能替换子类对象。

也就是说,Where()方法返回IQueryable接口的子类对象,并为其父类对象IQueryable赋值。

那么Where()返回什么样的对象(IQueryable的什么样的子类对象)?

在上面的局部变量窗口中再次查看查询的返回值类型,如下图所示:

我们可以清楚地看到,查询的返回类型是DbQuery类型。

然后我们使用DbQuery接收对象,代码如下:

复制的代码如下:dbQuerymodels。博客文章查询=(db。blog articles . where(p=p . aisdel==false))Asdbquerymodels。博客文章。

因为Where()方法返回一个IQueryable对象,所以有必要将该对象转换为DbQuery对象。

第二,延迟加载DbQueryT泛型接口类。

上面的定义已经说了EF延迟加载的定义,那么当我们在这里查询query中的对象时,数据库是否执行查询操作呢?

我们在这里使用SqlServer自带的Profiler软件进行检查。

(1)打开SqlServerProfiler软件,新建一个查询,首先有一个查询记录,如下图:

我们用上图红色箭头指示的橡皮清除记录,如下图所示:

我们重新开始调试并运行代码。当程序运行到断点时,我们看到查询没有值,如下图所示:

单步执行并继续下一步。我们发现查询的值已经在局部变量窗口中获得,如下图所示:

查询的值,如下图所示:

那么我们的SqlServerProfiler追踪器怎么了?没有任何变化,如下图所示:

如果我们用ADO.NET操作数据库,查询数据后数据会立即发送到接收对象(例如DataTable对象),但是EF为什么不操作数据库立即查询数据呢?

数据库查询对象加载延迟。

当我们使用查询对象时,我们返回去查询数据库,并继续下一步。结果如下:

这时,列表得到了值,然后Sql Server Profiler发生了变化,出现了查询数据库的记录,如下图所示:

也就是说,当查询对象ToList()时,就发生了查询数据库的操作。

三.摘要

1)1)EF中的DbQuery对象在操作数据库时有延迟加载,但在使用ListT直接接受对象时没有;

2)延迟加载不会立即查询数据库,但EF只会在使用数据时查询数据库。

以上是ASP.NET MVC开发过程中EF延迟加载的相关介绍,希望对大家的学习有所帮助。

版权声明:ASP.NET MVC开发的EF延迟加载是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。