运维开发网

EntityFramework使用LINQ来操作实体

运维开发网 https://www.qedev.com 2022-09-08 22:07 出处:网络
本文详细讲解了EntityFramework使用LINQ操作实体的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一、什么是LINQ TO Entities

本文详细讲解了EntityFramework使用LINQ操作实体的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一、什么是LINQ TO Entities

LINQ的全称是语言集成查询,是一种在。网语。实体的LINQ是一种机制,便于使用LINQ查询概念模型。

因为LINQ是一种声明性语言,它让我们专注于我们需要什么数据,而不是我们应该如何检索它。LINQ给实体提供了一个很好的关于实体数据模型的抽象,所以我们可以用LINQ来指定要检索什么数据,然后LINQ给实体提供者将处理数据库访问并为我们获取必要的数据。

二、LINQ to Entities执行流程

当我们使用LINQ到实体在实体数据模型上执行LINQ查询时,这些LINQ查询将首先被编译以决定我们需要获得什么数据,然后编译后的语句将被执行。从应用程序的角度来看,被。NET最终还是要还的。


该图显示了实体LINQ的概念数据模型,它依赖EntityClient来使用EF。

执行流程:

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

三、使用LINQ to Entities操作实体

LINQ有两种查询方式:
1 .查询语法。
2。方法语法。

选择哪种语法完全取决于你的习惯,两种语法的表现是一样的。查询语法相对容易理解,但灵活性较差;相反,方法语法有点难以理解,但它提供了更多的灵活性。您可以使用方法语法链接多个查询,以便在一条语句中获得最大的结果。

这里有一个简单的例子来理解这两种方法之间的区别。创建一个控制台程序并将其命名为。

1、定义领域实体:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace LINQDemo.Model{ public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public DateTime PublicationDate { get; set; } }}2、定义初始化器,并写入初始化数据using LINQDemo.Model;using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace LINQDemo.EF{ public class SeedingDataInitializer : DropCreateDatabaseAlwayslt;Contextgt; { /// lt;summarygt; /// 初始化种子数据 /// lt;/summarygt; /// lt;param name="context"gt;lt;/paramgt; protected override void Seed(Context context) { context.Books.Add(new Book { Name = "C#高级编程(第十版)", Author = "小明", PublicationDate = Convert.ToDateTime("2017-12-11 12:12:45") }); context.Books.Add(new Book { Name = "oracle从入门到精通", Author = "张三", PublicationDate = Convert.ToDateTime("2015-12-11 12:12:45") }); context.Books.Add(new Book { Name = "JavaScript高级编程", Author = "李四", PublicationDate = Convert.ToDateTime("2011-09-11 12:12:45") }); base.Seed(context); } }}3、定义数据库上下文类using LINQDemo.Model;using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace LINQDemo.EF{ public class Context :DbContext { public Context() : base("AppConnection") { Database.SetInitializerlt;Contextgt;(new SeedingDataInitializer()); } // 添加到数据上下文 public Virtual DbSetlt;Bookgt; Books { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 设置生成的表名:Book modelBuilder.Entitylt;Bookgt;().ToTable("Book"); base.OnModelCreating(modelBuilder); } }}4、Main函数定义如下:using LINQDemo.EF;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace LINQDemo{ class Program { static void Main(string[] args) { using (var context = new Context()) { #region 查询语法 var result = from p in context.Books where p.Name.Equals("JavaScript高级编程") select p; #endregion #region 方法语法 var books = context.Books.Where(p =gt; p.Name.Equals("JavaScript高级编程")); foreach (var item in books) { Console.WriteLine(string.Format("书名:{0},作者:{1},发布时间:{2}", item.Name, item.Author, item.PublicationDate)); } #endregion } Console.WriteLine("完成"); Console.ReadKey(); } }}5、运行程序,查看结果


查看数据库结果:


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

关键理解:

在对实体使用LINQ时,了解何时使用IEnumerable和IQueryable很重要。如果使用IEnumerable,将立即执行查询;如果使用IQueryable,则在应用请求枚举查询结果时才执行查询,即延迟查询,延迟的时间就是枚举查询结果的时间。

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

这就是这篇关于实体框架使用LINQ操作实体的文章。

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号