網站首頁 編程語言 正文
一、什么是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{ /// /// 初始化種子數據 /// /// 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(new SeedingDataInitializer()); } // 添加到數據上下文 public virtual DbSet Books { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 設置生成的表名:Book modelBuilder.Entity ().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查詢要求枚舉時才會執行。
原文鏈接:https://www.cnblogs.com/dotnet261010/p/8045217.html
相關推薦
- 2022-09-25 CopyOnWriteArrayList的源碼分析
- 2022-08-22 python深度學習tensorflow1.0參數初始化initializer_python
- 2022-07-14 python中序列的逆序方式_python
- 2022-02-18 解決 Syntax Error: Error: PostCSS received undefined
- 2023-01-15 解讀keras中的正則化(regularization)問題_python
- 2022-06-30 深度卷積神經網絡各種改進結構塊匯總_其它綜合
- 2022-09-16 python解析照片拍攝時間進行圖片整理_python
- 2022-04-14 Python報mongod:?error?while?loading?shared?librarie
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支