千家信息网

Entity Framework如何使用LINQ操作实体

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章将为大家详细讲解有关Entity Framework如何使用LINQ操作实体,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、什么是LINQ TO Enti
千家信息网最后更新 2025年01月19日Entity Framework如何使用LINQ操作实体

这篇文章将为大家详细讲解有关Entity Framework如何使用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、定义领域实体:

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 : DropCreateDatabaseAlways    {        ///         /// 初始化种子数据        ///         ///         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.SetInitializer(new SeedingDataInitializer());        }        // 添加到数据上下文        public virtual DbSet Books { get; set; }        protected override void OnModelCreating(DbModelBuilder modelBuilder)        {            // 设置生成的表名:Book            modelBuilder.Entity().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 => 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 to Entities时,理解何时使用IEnumerable和IQueryable很重要。如果使用了IEnumerable,查询会立即执行,如果使用了IQueryable,直到应用程序请求查询结果的枚举时才会执行查询,也就是查询延迟执行了,延迟到的时间点是枚举查询结果时。

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

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

查询 数据 语法 结果 实体 数据库 方法 程序 模型 高级 应用程序 语句 应用 编程 命令 篇文章 语言 必要 上下 上下文 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北网络安全工作责任制 虹口区现代化软件开发排行 上海软件开发者一般在哪里找 跟软件开发有关的参考文献 数据库运维工程师能做多少年 软件开发分离 贵州软件开发标准 安徽软件开发公司有哪些 荒野大镖客中国有服务器吗 数据库与物联网的关系 手机锁屏无法连接到服务器 南通医保服务器错误500 网络安全宣传wifi 网络安全天才是真的吗 广州专业的网络安全机构实战教学 企业网络安全检查计划 管理服务器含监控平台软件 网络安全的手抄报青少年 盐城江苏服务器 迷你世界切换服务器有什么好处 门头沟区网络技术服务报价 网络安全要自学编程吗 公共信息网络安全检察工作性质 金山区海航软件开发直销价格 计算机网络技术职业晋升渠道 职高计算机网络技术有什么课程 数据库成果奖励 服务器托管带宽价格 国家网络安全宣传周宣传素材 广电网络服务器起黄灯
0