Entity Framework-LINQ

Linq是.Net的一個重要的突破,Linq的主要目的是用來作為.Net中的一種通用查詢語言.

Linq設計的目的是針對查詢,不包含新增 修改 刪除等資料異動的功能,因此在EF中Linq當然也只能用於作為查詢,其他部分都與Linq沒有任何關係.

使用Linq的的最大好處是Linq是一種基於物件的強型別的查詢語法,因此可以很容易在編譯時期就能確認語法是否有問題.

 

對於Linq必須要有個概念,Linq本身設計上是可以跨不同資料來源,譬如XML,DataSet…等等.

所以不同的資料來源會有對應的Linq Library,目前內建於.Net中的Linq Libray.

1.Linq to Object

2.Linq to XML

3.Linq to ADO.Net

而且他的資料來源,Linq提供了擴展方式.譬如網路上可以找到WMI to Linq等相關Library,如果有能力也可以自行設計擴展.

因此相同的對於EF而言,因此EF也擴展了Linq來支持.

 

 

Linq在撰寫時有兩種方式

1.Linq語法

List<Customer> customers = ...;
var q = from c in customers
        where c.Id == 1;

2.Lambda表示式

List<Customer> customers = ...;
var q = customers.Where(c => c.Id == 1);

這兩種寫法上最後的結果都相同,效能也相同,不過建議使用第2種,對於操作Linq會更有彈性.

 

EF中對於Linq的擴展比其他資料來源比較複雜些.

底下為EF中的架構圖

由於EF在架構上是沒有綁定資料庫,EF提供了EntityClient Data Provider概念,而Data Provider最終是透過ADO.Net去存取資料庫.

因此當一個非.Net原生支援(目前只有MSSQL)的資料庫要能支援EF必須提供ADO.Net provider外還必須提供EntityClient Data Provider.

EntityClient Data Provider的主要目的是用來轉譯Linq與Entity SQL Query成ADO.Net的Command(SQL).

因此在Linq在EF中並不是所有功能都支持.必須看EntityClient Data Provider有沒有(能不能)將Linq語法轉譯成ADO.Net的Command(SQL).

而對於Linq,EF已經定義了一些標準ANSI通用的查詢對應函數.譬如Contains函數對應LIKE語法.

var q = dbContext.Customers.Where(c => c.Name.Contains("XXX"));

但由於EF設計上並沒有綁定資料庫,因此對於一些特定資料庫的特定功能,EF提供了另外的擴展機制來處理.

譬如在MS-SQL可以透過SqlFunctions這種類別來使用對應到MS-SQL中的特定方法,譬如

var q = dbContext.Customer.Where(c => SqlFunctions.DateDiff("ss", c.CreatedDate, DateTime.Today) > 0);

上面例子透過SqlFunctions中的DateDiff方法去對應SQL語法中的DATEDIFF函數,當然這樣做也代表這個語法綁訂了MS-SQL.

此外對於User Define Function(使用者自訂函數)部分EF也有方式提供擴展,後續章節再針對此部分做說明.

 

在EF中使用Linq常常會問的問題或是錯誤.

譬如底下的Code

var q = dbContext.Customers.Where(c => c.Name.Contants("XX") && Check(c));

Check函數是另外撰寫用來檢查是否符合的一段C#程式,中間包含了很多複雜邏輯.

由上面的觀念可以知道這個語法執行時一定會出錯,因為EntityClient Data Provider並沒有(也不知道),Check函數應該要怎麼翻譯成ADO.Net的Command(SQL).

所以我們些調整

var q = dbContext.Customers.Where(c => c.Name.Contants("XX")).ToList().Where(c => Check(c));

將語法分為兩段先透過.ToList()方法將資料從資料庫中取回到記憶體中,因為這時候資料已經在記憶體了,因此第二段的Where實際上是透過Linq to Object去操作而非EF.

而要注意一點,在操作EF時必須要了解甚麼時候會把資料從資料庫取回.

否則如果上面的例子寫成如下語法

var q = dbContext.Customers.ToList().Where( c.Name.Contants("XX") && c => Check(c));

雖然結果是相同的,但效能差異相當大

因為.ToList()方法執行時會把所有資料庫中的Customers資料拉回到記憶體中,然後在程式中去執行Where去做塞選.

而前述的方法透過Where(c => c.Name.Contants(“xx”))在查詢時先用SQL語法去塞選結果到記憶體中再做後續檢查.

时间: 2024-08-25 14:27:19

Entity Framework-LINQ的相关文章

Entity Framework Linq 简单笔记

类型查询 public class bbb:xxx {} var items = from c in context.Dbset<xxx>    where c is bbb   select c;var items = from c in context.Dbset<xxx> .OfType<bbb>()  select c;

Linq实战 之 Linq to Sql及Entity Framework操作详解

Linq实战 之 Linq to Sql及Entity Framework操作详解 一:linq to db的框架 1. linq to sql 2. linq to ado.net entity framework linq to sql是一个团队 ef 是一个团队... linq to sql => ef 团队. linq to sql 适合一些小型的项目 => sqlserver ef 适合中形的项目,而且可以支持 sqllite,mysql,sqlserver 掌柜的项目开发中:使用的

让Entity Framework不再私闯sys.databases 不自动创建数据库(转载)

原文:http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html 这里的"私闯sys.databases"是指Entity Framework默认发起的查询:SELECT Count(*) FROM sys.databases WHERE [name]=N'数据库名' 注:本文针对的是Entity Framework Code First场景,Entity Framework的版本

Entity Framework 与 LINQ to SQL

Entity Framework和LINQ to SQL到底有什么区别?这是一个很常见的问题.下面的表中简要罗列了两种技术的主要区别. LINQ to SQL Entity Framework 复杂度 相对不复杂 相对比较复杂 模型 域模型(Domain model) 概念数据模型(Conceptual data model) 数据库服务器 SQL Server 多种数据库产品 开发时间 快速应用开发 需要较长时间,但支持更多特性 继承 困难 容易 文件类型 DBML文件 EDMX,CDSL,M

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

在本篇中,我们将接着上一篇“LINQ to SQL 和 Entity Framework(上)”的内容,继续使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的关键特性.我们在此关注的是LINQ to SQL和Entity Framework中的”LINQ”部分,并会比较这两种技术的相同和不同之处.通过我们之前介绍的LINQ知识还有将来会讨论的更多LINQ Operators,相信阅者能针对LINQ to SQL和Entity Framework写出优雅

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

在上一篇中,我们从理论和概念上详细的了解了LINQ的第二种架构“解释查询”.在这接下来的二个篇章中,我们将使用LINQ to SQL和Entity Framework来实践“解释查询”,学习这些技术的关键特性.在本系列文章中,我不准备事无巨细的讨论LINQ to SQL和Entity Framework的方方面面,毕竟那样需要太多的篇幅,也会让我们从LINQ上面转移注意力,况且,园子里也有不少介绍LINQ to SQL和Entity Framework的好文章.我们在此关注的是LINQ to S

《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7  在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ查询,使用了类似这样的操作 group by,join,和where:你想使用Include()方法预先加载额外的实体.另外你想使用Code-First来管理数据访问. 解决方案 假设你有如图5-22所示的概念模型 图5-22 一个简单的包含Club和Event以及它们之间一对多关联的模型 在Visual S

在Linq to sql 和 Entity framework 中使用lambda表达式实现left join

我们知道lambda表达式在Linq to sql 和 Entity framework 中使用join函数可以实现inner join,那么怎么才能在lambda表达式中实现left join呢?秘诀就是在join后面加上一个函数DefaultIfEmpty函数,实际上这个函数在linq中貌似也只有将inner join转换为left join的作用,示例如下 var joinResult = DB.Table1s.Join(DB.Table2s, a => a.id, b => b.id,

Entity Framework技术系列之7:LINQ to Entities

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 前言 LINQ(Language Integrated Query,语言集成查询)是一组用于C#和VB.NET语言的扩展,它允许编写C#或者VB.NET代码,以与查询数据库相同的方式操作内存数据.LINQ提Entity Framework技术系

高仿Entity Framework?Linq to SQL也有春天!

开发这个框架,主要起源于有很多使用ALinq或者Linq to SQL的用户,经常向我抱怨,它们使用起来的确很爽,但是动态查询太让人纠结了.这个框架主要就是想解决客户碰到的动态查询的问题.至今为至,已经断断续续地写了一年多了,写这个框架,充满了挑战与乐趣.当然,现在更觉得,能把文档写好,更是挑战.大多数的程序员,一直对于写文档这码事,不大重视,我也是其中的一员.但是,长期地与客户打交道,让我认识到,文档是非常地重要的,而且,能把文档写好也不是件容易的事情.这次的发布,更多的精力放在了文档的编写上