Entity?Framework如何使用LINQ操作实体


这篇文章将为大家详细讲解有关EntityFramework如何使用LINQ操作实体,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、什么是LINQ TO Entities

LINQ,全称是Language-INtegrated Query(集成语言查询),是.NET语言中查询数据的一种技术。LINQ to Entities是一种机制,它促进了使用LINQ对概念模型的查询。

因为LINQ是声明式语言,它让我们聚焦于我们需要什么数据而不是应该如何检索数据。LINQ to Entities在实体数据模型之上提供了一个很好的抽象,所以我们可以使用LINQ来指定检索什么数据,然后LINQ to Entities provider会处理访问数据库事宜,并为我们取到必要的数据。

二、LINQ to Entities执行流程

当我们使用LINQ to Entities对实体数据模型执行LINQ查询时,这些LINQ查询会首先被编译以决定我们需要获取什么数据,然后执行编译后的语句,从应用程序的角度看,最终会返回.NET理解的CLR对象。

上图展示了LINQ to Entities依赖EntityClient才能够使用EF的概念数据模型

执行流程:

1、应用程序创建一个LINQ查询。
2、LINQ to Entities会将该LINQ查询转换成EntityClient命令。
3、EntityClient命令然后使用EF和实体数据模型将这些命令转换成SQL查询。
4、然后会使用底层的ADO.NET provider将该SQL查询传入数据库。
5、该查询然后在数据库中执行。
6、执行结果返回给EF。
7、EF然后将返回的结果转换成CLR类型,比如领域实体。
8、EntityClient使用项目,并返回必要的结果给应用程序。

三、使用LINQ to Entities操作实体

使用LINQ查询的方式有两种:
1、查询语法。
2、方法语法。

选择哪种语法完全取决于你的习惯,两种语法的性能是一样的。查询语法相对更容易理解,但是灵活性稍差;相反,方法语法理解起来有点困难,但是提供了更强大的灵活性。使用方法语法可以进行链接多个查询,因此在单个语句中可以实现最大的结果。

下面以一个简单的例子来理解一下这两种方法的区别。创建一个控制台程序,并命名。

1、定义领域实体:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceLINQDemo.Model{publicclassBook{publicintId{get;set;}publicstringName{get;set;}publicstringAuthor{get;set;}publicDateTimePublicationDate{get;set;}}}

2、定义初始化器,并写入初始化数据

usingLINQDemo.Model;usingSystem;usingSystem.Collections.Generic;usingSystem.Data.Entity;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceLINQDemo.EF{publicclassSeedingDataInitializer:DropCreateDatabaseAlways<Context>{///<summary>///初始化种子数据///</summary>///<paramname="context"></param>protectedoverridevoidSeed(Contextcontext){context.Books.Add(newBook{Name="C#高级编程(第十版)",Author="小明",PublicationDate=Convert.ToDateTime("2023-12-1112:12:45")});context.Books.Add(newBook{Name="oracle从入门到精通",Author="张三",PublicationDate=Convert.ToDateTime("2023-12-1112:12:45")});context.Books.Add(newBook{Name="JavaScript高级编程",Author="李四",PublicationDate=Convert.ToDateTime("2011-09-1112:12:45")});base.Seed(context);}}}

3、定义数据库上下文类

usingLINQDemo.Model;usingSystem;usingSystem.Collections.Generic;usingSystem.Data.Entity;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceLINQDemo.EF{publicclassContext:DbContext{publicContext():base("AppConnection"){Database.SetInitializer<Context>(newSeedingDataInitializer());}//添加到数据上下文publicvirtualDbSet<Book>Books{get;set;}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){//设置生成的表名:BookmodelBuilder.Entity<Book>().ToTable("Book");base.OnModelCreating(modelBuilder);}}}

4、Main函数定义如下:

usingLINQDemo.EF;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceLINQDemo{classProgram{staticvoidMain(string[]args){using(varcontext=newContext()){#region查询语法varresult=frompincontext.Bookswherep.Name.Equals("JavaScript高级编程")selectp;#endregion#region方法语法varbooks=context.Books.Where(p=>p.Name.Equals("JavaScript高级编程"));foreach(variteminbooks){Console.WriteLine(string.Format("书名:{0},作者:{1},发布时间:{2}",item.Name,item.Author,item.PublicationDate));}#endregion}Console.WriteLine("完成");Console.ReadKey();}}}

5、运行程序,查看结果

查看数据库结果:

查询语法和方法语法的执行结果都是一样的。

重点理解:

当使用LINQ to Entities时,理解何时使用IEnumerable和IQueryable很重要。如果使用了IEnumerable,查询会立即执行,如果使用了IQueryable,直到应用程序请求查询结果的枚举时才会执行查询,也就是查询延迟执行了,延迟到的时间点是枚举查询结果时。

如何决定使用IEnumerable还是IQueryable呢?使用IQueryable会让你有机会创建一个使用多条语句的复杂LINQ查询,而不需要每条查询语句都对数据库执行查询。该查询只有在最终的LINQ查询要求枚举时才会执行。

关于“EntityFramework如何使用LINQ操作实体”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


上一篇:家具行业开发小程序有什么好处

下一篇:Html5如何实现Canvas动画基础碰撞检测


Copyright © 2002-2019 测速网 www.inhv.cn 皖ICP备2023010105号
测速城市 测速地区 测速街道 网速测试城市 网速测试地区 网速测试街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!

热门搜索 城市网站建设 地区网站制作 街道网页设计 大写数字 热点城市 热点地区 热点街道 热点时间 房贷计算器