一、什么是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操作的更多相关文章

  1. Entity Framework 简单增删改操作

    前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...

  2. [转]在Entity Framework中使用LINQ语句分页

    本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...

  3. Entity Framework 中的in操作实例

    var listimportDataEOIResoults = importDataEOIResoults.Select(i => i.ProductSelectionId).ToList(); ...

  4. Entity Framework 4 数据事务操作

    利用数据库链接进行事务操作 var db = ConnectionHelper.GetConn(ConnectionType.Write);//获取上下文 var conn = db.Connecti ...

  5. Entity Framework 6 执行Linq to Entities异常"p__linq__1 : String truncation: max=0, len=2, value='测试'"

    场景再现 我需要查询公司名称包含给定字符串的公司,于是我写了下面的测试小例子: var condition = "测试"; var query = from b in db.Com ...

  6. LINQ之路10:LINQ to SQL 和 Entity Framework(下)

    在本篇中,我们将接着上一篇“LINQ to SQL 和 Entity Framework(上)”的内容,继续使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术 ...

  7. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

  8. LINQ TO SQL和Entity Framework 的关系 你了解多少?

    1. LINQ  TO SQL  和EF 特点:  LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist   ...

  9. 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库

    目的 本教程介绍如何使用 Entity Framework.语言集成查询 (LINQ),以及如何对 Oracle 数据库使用 Model-First 以生成数据定义语言 (DDL) 脚本. 所需时间 ...

  10. LINQ之路 9:LINQ to SQL 和 Entity Framework(上)

    在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”.在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的 ...

随机推荐

  1. 【js】js中的||和&&

    逻辑与&&和逻辑或||操作符可以应用于任何类型的操作数,而不仅仅是布尔值. 几乎所有语言中||和&&都遵循“短路”原理, 如&&中第一个表达式为假就不会 ...

  2. mySQL把秒转换成日期

    mysql> SELECT SEC_TO_TIME (3600); +--------------------+ | SEC_TO_TIME (3600) | +---------------- ...

  3. DataGridView合并单元格(一列或一行)

    #region"合并单元格的测试(一列或一行)" // int?是搜索一种类型(可空类型),普通的int不能为null,而用int?,其值可以为null //private int ...

  4. SIPp常用脚本之一:register注册

    SIPp,VOIP并发测试.性能测试的神器. 本文记录一下常用的脚本文件. 一.reg.xml 此文件是sipp的执行的脚本流程. <!-- --> <!-- You should ...

  5. Google大脑科学家贾杨清(Caffe缔造者)-微信讲座

    Google大脑科学家贾杨清(Caffe缔造者)-微信讲座 机器学习Caffe 贾扬清 caffe   一.讲座正文: 大家好!我是贾扬清178,目前在Google Brain69,今天有幸受雷鸣师兄 ...

  6. 使用 powerdesigner 将数据库表结构逆向工程生成对应的word文档

    本机系统win10 + mysql 5.7.17 + powerDesigner 16.5 + mysql-connector-odbc-5.3.9-winx32.msi 1 使用 PowerDesi ...

  7. 浅谈Javascript中的void操作符

    由于JS表达式偏啰嗦,于是最近便开始采用Coffeescript来减轻负担.举个栗子,当我想取屋子里的第一条dog时,首先要判断house对象是否存在,然后再判断house.dogs是否存在,最后取h ...

  8. How to set JAVA environment variables in Linux or CentOS

    How to set JAVA environment variables JAVA_HOME and PATH in Linux After installing new java (jdk or ...

  9. CentOS 7 设置中文环境

    在vultr上的虚拟机虽然安装了中文支持,但是默认显示英语. 只要修改 /etc/locale.conf 即可. LANG="zh_CN.UTF-8" LANGUAGE=" ...

  10. WCF入门学习1-最简单的一次通信

    跟着msdn的教程试了一下wcf,真心好用 1.先创建一个wcf服务库,是服务类库,远程的lib 2.全部按照默认设置,不修改.然后点发布,会出现一个wcf测试客户端,可以看有没有发布成功. 3.ms ...