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<Context>
    {
        /// <summary>
        /// 初始化种子数据
        /// </summary>
        /// <param name="context"></param>
        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<Context>(new SeedingDataInitializer());
        }

        // 添加到数据上下文
        public virtual DbSet<Book> Books { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // 设置生成的表名:Book
            modelBuilder.Entity<Book>().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操作实体的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Entity Framework实体拆分多个表

    一.概念 实体拆分:一个实体拆分成多个表,如Product实体,可以拆分成Product和ProductWebInfo两个表,Product表用于存储商品的字符类信息,ProductWebInfo用于存储商品的图片信息,两张表通过SKU进行关联. 1.Product实体类结构: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Comp

  • Entity Framework表拆分为多个实体

    概念 表拆分:一个表拆分成多个实体,例如Photograph表,可以拆分为Photograph和PhotographFullImage两张表. 1.Photograph实体结构: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Li

  • Entity Framework使用Code First模式管理数据库

    一.管理数据库连接 1.使用配置文件管理连接之约定 在数据库上下文类中,如果我们只继承了无参数的DbContext,并且在配置文件中创建了和数据库上下文类同名的连接字符串,那么EF会使用该连接字符串自动计算出数据库的位置和数据库名.比如,我们的数据库上下文定义如下: using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; usin

  • Entity Framework管理一对二实体关系

    在上一篇文章中,简单的介绍了使用Fluent API如何管理一对一的实体关系,在这篇文章中,接着介绍Fluent API如何管理一对多的实体关系. 要在数据库中配置一对多关系,我们可以依赖EF约定,还可以使用数据注解或Fluent API来显式创建关系.接下来使用捐赠者Donator和支付方法PayWay这两个类来举例子,这里的一对多关系是:一个人可以通过多种支付方式赞助我. 支付方式类PayWay结构如下: using System; using System.Collections.Gene

  • Entity Framework管理一对一实体关系

    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种关系: 1.一对一关系: one to one 2.一对多关系: one to many 3.多对多关系::many to many 首先要明确关系的概念.关系就是定义两个或多个对象之间是如何关联的.它是由关系两端的多样性值识别的,比如,一对多意味着在关系的一端,只有一个实体,我们有时称为父母:在关

  • Entity Framework使用Code First的实体继承模式

    目录 一.TPT继承模式 1.Person类 2.使用数据迁移创建数据库 3.填充数据 二.TPH模式 1.创建有继承关系的实体类 2.创建数据上下文 3.使用数据迁移创建数据库 4.不使用默认生成的区别多张表的类型 5.填充数据 6.查询数据 三.TPC模式 1.创建实体类 2.配置数据上下文 3.使用数据迁移生成数据库 4.填充数据 Entity Framework的Code First模式有三种实体继承模式 1.Table per Type (TPT)继承 2.Table per Clas

  • Entity Framework使用LINQ操作实体

    一.什么是LINQ TO Entities LINQ,全称是Language-INtegrated Query(集成语言查询),是.NET语言中查询数据的一种技术.LINQ to Entities是一种机制,它促进了使用LINQ对概念模型的查询. 因为LINQ是声明式语言,它让我们聚焦于我们需要什么数据而不是应该如何检索数据.LINQ to Entities在实体数据模型之上提供了一个很好的抽象,所以我们可以使用LINQ来指定检索什么数据,然后LINQ to Entities provider会

  • Entity Framework模型优先与实体对象查询

    目录 一.概念: 1.EF6 可实现的功能: 二.安装Entity Framework6 1.VS2019 Installer安装“Entity Framework6 工具” 2.通过Nuget安装“Entity Framework”: 三.新建ObjectContext 和EntityObject 1.“根据模型生成的数据库”的设计器功能实现ModelFirst. 四.实体对象查询:linq to Entities 1.使用lambda表达式查询 2.执行存储过程(通过“添加”-----”函数

  • c# 使用Entity Framework操作Access数据库的示例

    Entity Framework是C#开发中最常见的ORM工具.默认Entity Framework只提供支持MSSQL的provider factory.但是开发者开源贡献了对SQLite.MySql以及Access等的支持. Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何利用Entity Framework进行查询.插入.更新和删除数据.

  • Entity Framework根据实体的EntityState状态实现增删改查

    在上一篇文章中,我们讲解了使用EF实现简单的增删改查,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查. 一.修改数据 上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询出来要修改的数据,然后在修改.但是这种操作会导致多次操作数据库: 从上面的截图中可以看出,查询数据的时候会执行一次事物,修改的时候又执行了一次事物,即修改数据会操作两次数据库.那么有没有什么方法可以只操作一次数据库呢?那就是下面要讲解的EntityState. 使用EntityState优化上面的修

  • Entity Framework之DB First方式详解

    EF(Entity Framework的简称,下同)有三种方式,分别是:DataBase First. Model First和Code First. 下面是Db First的方式: 1. 数据库库中存在两个表,一个是专业表,一个学生表,一个学生只能属于一个专业: 其中T_Major是专业表,T_Student是学生表,StudentId是学号,MajorId是专业Id,T_Major与T_Student是一对多的关系. 2. 项目中添加数据库实体模型 因为之前没有配置过数据库连接,所以点击"新

随机推荐