日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
LinqtoSQL體系結(jié)構(gòu)分析

在向大家詳細(xì)介紹Linq的整體框架之前,首先讓大家了解下Linq to SQL體系結(jié)構(gòu),然后全面介紹Linq的整體框架。

創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營銷,提供網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、微信小程序、公眾號(hào)商城、等建站開發(fā),創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。

LINQ,語言集成查詢,就是把一些查詢操作集成到語言中(貌似是廢話),比如查詢關(guān)系數(shù)據(jù)庫,而且提供一種一致的操作方式,不管最終的數(shù)據(jù)存儲(chǔ)在哪里?內(nèi)存中,遠(yuǎn)程數(shù)據(jù)庫還是一Xml格式文件存儲(chǔ),不僅僅如此,你還可以用你豐富的想象力擴(kuò)充自己的查詢。Linq to SQL無疑把Linq的能量發(fā)揮的***,我們就以Linq to SQL體系結(jié)構(gòu)來學(xué)習(xí)一下Linq的整體框架。

在上兩章里面我們通過源代碼探討了關(guān)于DataContext的初始化和Table對(duì)象的獲取,以及Provider的初始化。今天我們來看看Linq to SQL執(zhí)行的大至流程

假如我們寫下這樣的代碼:

 
 
 
 
  1. DataContext dbCtx = new DataContext("server=localhost;database=cnblogs;user id=sa;pwd=sa");  
  2. Table posts = dbCtx.GetTable();  
  3. foreach (Post p in posts)  
  4. {  
  5. Console.WriteLine(p.Title);  

在幕后到底發(fā)生了什么呢?

看到foreach代碼大家肯定都知道這個(gè)Table肯定實(shí)現(xiàn)了IEnumerable接口,這里的foreach的代碼和下面這個(gè)代碼的效果是一樣的,實(shí)際上最終也是轉(zhuǎn)換成這樣的代碼:

 
 
 
 
  1. IEnumerator iterator = posts.GetEnumerator();  
  2. while (iterator.MoveNext())  
  3. {  
  4. Post p = iterator.Current;  
  5. Console.WriteLine(p.Title);  

在***個(gè)式子編譯的時(shí)候后面的表達(dá)式實(shí)際上會(huì)被轉(zhuǎn)換為一個(gè)匿名方法,IsTrue也就是一個(gè)“方法的指針”,和我們已經(jīng)熟識(shí)的委托沒有什么區(qū)別。而第二個(gè)式子在執(zhí)行的時(shí)候右邊的表達(dá)式會(huì)被編譯為一個(gè)樹的數(shù)據(jù)結(jié)構(gòu)(C#編譯器實(shí)際上為我們做了詞法分析、語法分析了,在編譯原理里前兩個(gè)階段就是詞法分析和語法分析,詞法分析首先遍歷傳入的語言字符串,在我們這里就是x=>x==5,詞法分析器讀取每個(gè)字符,識(shí)別出標(biāo)識(shí)符,常量,關(guān)鍵字,運(yùn)算符,詞法分析器的產(chǎn)出是Token(符號(hào));然后語法分析器根據(jù)該語言的語法范式將Token組織成一個(gè)樹形結(jié)構(gòu),用這個(gè)樹形的結(jié)構(gòu)來表示該語言的代碼文件,在我們這里x=>x==5就是Lambda表達(dá)式這門“語言”的語句了,Expression就是那個(gè)樹)。Expression是一個(gè)遞歸形式的定義,它有兩個(gè)屬性:Parameters,這個(gè)屬性就是Lambda表達(dá)式的參數(shù),在上面的代碼中就是:x,它還有一個(gè)屬性是Body,Body也是一個(gè)Expression類型,從這里我們看到Expression是這樣遞歸下去的。

通過上面的介紹,實(shí)際上Queryable中的那些擴(kuò)展方法所接受的Lambda表達(dá)式***被編譯為樹數(shù)據(jù)結(jié)構(gòu)。這些樹數(shù)據(jù)結(jié)構(gòu)攜帶有查詢表達(dá)式的語法,但是最終它們要查詢什么樣的數(shù)據(jù),是數(shù)據(jù)庫?還是XML或是Web Service就要靠IQueryProvider來解析了,從這里我們大概可以看到這樣一個(gè)結(jié)構(gòu):


看到這個(gè)圖,那我們有幾種擴(kuò)展Linq的方式呢?

***種:通過給IEnumerable或IQueryable添加擴(kuò)展方法,這個(gè)就是利用C#語言的特性來達(dá)到的。我將這種擴(kuò)展稱之為橫向的擴(kuò)展。

第二種:自己實(shí)現(xiàn)IQueryProvider,這種擴(kuò)展就是縱向的擴(kuò)展了,提供自己的Provider,然后這個(gè)Provider解析表達(dá)式樹生成最終具體的查詢操作。

小結(jié)

本文簡單的展示一下Linq to SQL體系結(jié)構(gòu),了解一下Linq的擴(kuò)展點(diǎn)在哪里,從這里我們也能看到,要做一個(gè)好擴(kuò)展的系統(tǒng),一個(gè)很重要的任務(wù)就是提煉接口,接口的粒度,接口的職責(zé)等等都是核心關(guān)注點(diǎn)。使用接口將幾個(gè)類隔離,變化點(diǎn)也就封裝起來了。


當(dāng)前題目:LinqtoSQL體系結(jié)構(gòu)分析
本文網(wǎng)址:http://www.dlmjj.cn/article/djceces.html