zoukankan      html  css  js  c++  java
  • 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、定义领域实体:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace LINQDemo.Model
     8 {
     9     public class Book
    10     {
    11         public int Id { get; set; }
    12 
    13         public string Name { get; set; }
    14 
    15         public string Author { get; set; }
    16 
    17         public DateTime PublicationDate { get; set; }
    18     }
    19 }

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

     1 using LINQDemo.Model;
     2 using System;
     3 using System.Collections.Generic;
     4 using System.Data.Entity;
     5 using System.Linq;
     6 using System.Text;
     7 using System.Threading.Tasks;
     8 
     9 namespace LINQDemo.EF
    10 {
    11     public class SeedingDataInitializer : DropCreateDatabaseAlways<Context>
    12     {
    13         /// <summary>
    14         /// 初始化种子数据
    15         /// </summary>
    16         /// <param name="context"></param>
    17         protected override void Seed(Context context)
    18         {            
    19             context.Books.Add(new Book { Name = "C#高级编程(第十版)", Author = "小明", PublicationDate = Convert.ToDateTime("2017-12-11 12:12:45") });
    20             context.Books.Add(new Book { Name = "oracle从入门到精通", Author = "张三", PublicationDate = Convert.ToDateTime("2015-12-11 12:12:45") });
    21             context.Books.Add(new Book { Name = "JavaScript高级编程", Author = "李四", PublicationDate = Convert.ToDateTime("2011-09-11 12:12:45") });
    22             base.Seed(context);
    23         }
    24     }
    25 }

     3、定义数据库上下文类

     1 using LINQDemo.Model;
     2 using System;
     3 using System.Collections.Generic;
     4 using System.Data.Entity;
     5 using System.Linq;
     6 using System.Text;
     7 using System.Threading.Tasks;
     8 
     9 namespace LINQDemo.EF
    10 {
    11     public class Context :DbContext
    12     {
    13         public Context()
    14             : base("AppConnection")
    15         {            
    16             Database.SetInitializer<Context>(new SeedingDataInitializer());
    17         }
    18 
    19         // 添加到数据上下文
    20         public virtual DbSet<Book> Books { get; set; }
    21 
    22         protected override void OnModelCreating(DbModelBuilder modelBuilder)
    23         {
    24             // 设置生成的表名:Book
    25             modelBuilder.Entity<Book>().ToTable("Book");
    26             base.OnModelCreating(modelBuilder);
    27         }
    28     }
    29 }

     4、Main函数定义如下:

     1 using LINQDemo.EF;
     2 using System;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 using System.Text;
     6 using System.Threading.Tasks;
     7 
     8 namespace LINQDemo
     9 {
    10     class Program
    11     {
    12         static void Main(string[] args)
    13         {
    14             using (var context = new Context())
    15             {
    16                 #region   查询语法
    17                 var result = from p in context.Books where p.Name.Equals("JavaScript高级编程") select p;
    18                 #endregion
    19 
    20                 #region 方法语法
    21                 var books = context.Books.Where(p => p.Name.Equals("JavaScript高级编程"));
    22 
    23                 foreach (var item in books)
    24                 {
    25                     Console.WriteLine(string.Format("书名:{0},作者:{1},发布时间:{2}", item.Name, item.Author, item.PublicationDate));
    26                 }
    27                 #endregion
    28             }
    29 
    30             Console.WriteLine("完成");
    31             Console.ReadKey();
    32         }
    33     }
    34 }

     5、运行程序,查看结果

    查看数据库结果:

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

    重点理解:

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

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

  • 相关阅读:
    layui学习--tab选项卡
    json过滤不需要的字段
    转载 http协议无状态中的 "状态" 到底指的是什么?
    正则表达式30分钟入门教程--转载
    Hadoop 部署之 HBase (四)
    Hadoop 部署之 Hadoop (三)
    Hadoop 部署之 ZooKeeper (二)
    Hadoop 部署之环境准备(一)
    Kubernetes 集群日志管理 Elasticsearch + fluentd(二十)
    Kubernetes 监控方案之 Prometheus Operator(十九)
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/8045217.html
Copyright © 2011-2022 走看看