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操作的更多相关文章
- Entity Framework 简单增删改操作
前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...
- [转]在Entity Framework中使用LINQ语句分页
本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...
- Entity Framework 中的in操作实例
var listimportDataEOIResoults = importDataEOIResoults.Select(i => i.ProductSelectionId).ToList(); ...
- Entity Framework 4 数据事务操作
利用数据库链接进行事务操作 var db = ConnectionHelper.GetConn(ConnectionType.Write);//获取上下文 var conn = db.Connecti ...
- 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 ...
- LINQ之路10:LINQ to SQL 和 Entity Framework(下)
在本篇中,我们将接着上一篇“LINQ to SQL 和 Entity Framework(上)”的内容,继续使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术 ...
- Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作
Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...
- LINQ TO SQL和Entity Framework 的关系 你了解多少?
1. LINQ TO SQL 和EF 特点: LINQ TO SQL和Entity Framework都是一种包含LINQ功能的ORM 也就是所谓的关系对象的映射.其中包括的有DBFrist ...
- 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库
目的 本教程介绍如何使用 Entity Framework.语言集成查询 (LINQ),以及如何对 Oracle 数据库使用 Model-First 以生成数据定义语言 (DDL) 脚本. 所需时间 ...
- LINQ之路 9:LINQ to SQL 和 Entity Framework(上)
在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”.在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的 ...
随机推荐
- 解决spring el表达式不起作用
el表达式不起作用,如下图所示 现象: 在显示页面中加入: <%@ page isELIgnored="false" %>就OK了 参考:http://bbs.csdn ...
- 转 如何使用Windows Media Load Simulator进行Windows Media服务器性能测试和监控
Windows Media Load Simulator(WMLS)有两个主要的用途:作为极值或者压力测试工具和在线监视器. 1 极值和压力压力测试:你能够在达到期望的极值压力条件下测试离线的 ...
- OAF_OAF增删改-新增的实现(案例)
2014-09-14 Created By BaoXinjian
- c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。
//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max, ...
- jpa多条件查询重写Specification的toPredicate方法(转)
Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor.Criteria 查询:是一种类型安全和更面向对象的查询 . 这个接 ...
- java与java学习路线
JAVA学习路线图 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面 ...
- 【备用】SQL SERVER存储过程执行速度慢的问题
今天看到了但是暂时没有时间研究,先留着备用(Parameter Sniffing) http://blog.csdn.net/emili/article/details/2192081 http:// ...
- excel错误:外部表不是预期的格式 错误
环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...
- 又发现一个visual studio 2015的坑啊。
又发现一个visual studio 2015的坑啊...我的后台管理的目录名称叫@duck, 但是在新版VS2015中打开项目后编译,出现错误: Error opening response fil ...
- 更新yum源却忘了生成缓存 造成每次启动机器报:the package list needs to be rebuilt
更新yum源的后一定要执行下面的两条命令: yum clean all yum makecache 注意:如果有第三方源的时候是,开机发果不联网的时候,也会报这个错!!!!!