天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

走進(jìn)Linq-Linq to SQL源代碼賞析,通過(guò)Linq to SQL看Linq

系列文章導(dǎo)航:

走進(jìn)Linq--Linq橫空出世篇

走進(jìn)Linq-輝煌的背后

走進(jìn)Linq-Linq大觀園

不能不說(shuō)的C#特性-對(duì)象集合初始化器

不能不說(shuō)的C#特性-匿名類型與隱式類型局部變量

不能不說(shuō)的C#特性-擴(kuò)展方法

不能不說(shuō)的C#特性-匿名方法和Lambda表達(dá)式

不能不說(shuō)的C#特性-迭代器(上)及一些研究過(guò)程中的副產(chǎn)品

不能不說(shuō)的C#特性-迭代器(下),yield以及流的延遲計(jì)算

走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇

走進(jìn)Linq-Linq to Objects(下)實(shí)例篇

走進(jìn)Linq-Linq to SQL感性認(rèn)識(shí)篇

走進(jìn)Linq-Linq to SQL How do I(1)

走進(jìn)Linq-Linq to SQL How do I(2)

走進(jìn)Linq-Linq to SQL How do I(3)

走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)

走進(jìn)Linq-Linq to SQL源代碼賞析 Table的獲取過(guò)程

走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化

走進(jìn)Linq-Linq to SQL源代碼賞析,通過(guò)Linq to SQL看Linq


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

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

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

DataContext dbCtx = new DataContext("server=localhost;database=cnblogs;user id=sa;pwd=sa");
Table
<Post> posts = dbCtx.GetTable<Post>();
foreach (Post p in posts)
{
   Console.WriteLine(p.Title);
}

系列文章導(dǎo)航:

走進(jìn)Linq--Linq橫空出世篇

走進(jìn)Linq-輝煌的背后

走進(jìn)Linq-Linq大觀園

不能不說(shuō)的C#特性-對(duì)象集合初始化器

不能不說(shuō)的C#特性-匿名類型與隱式類型局部變量

不能不說(shuō)的C#特性-擴(kuò)展方法

不能不說(shuō)的C#特性-匿名方法和Lambda表達(dá)式

不能不說(shuō)的C#特性-迭代器(上)及一些研究過(guò)程中的副產(chǎn)品

不能不說(shuō)的C#特性-迭代器(下),yield以及流的延遲計(jì)算

走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇

走進(jìn)Linq-Linq to Objects(下)實(shí)例篇

走進(jìn)Linq-Linq to SQL感性認(rèn)識(shí)篇

走進(jìn)Linq-Linq to SQL How do I(1)

走進(jìn)Linq-Linq to SQL How do I(2)

走進(jìn)Linq-Linq to SQL How do I(3)

走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)

走進(jìn)Linq-Linq to SQL源代碼賞析 Table的獲取過(guò)程

走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化

走進(jìn)Linq-Linq to SQL源代碼賞析,通過(guò)Linq to SQL看Linq


 

既然如此那我們就得看看Table<TEntity>GetEnumerator方法了:

public IEnumerator<TEntity> GetEnumerator()
{
   
return ((IEnumerable<TEntity>)this.context.Provider.Execute(Expression.Constant(this)).ReturnValue).GetEnumerator();
}

系列文章導(dǎo)航:

走進(jìn)Linq--Linq橫空出世篇

走進(jìn)Linq-輝煌的背后

走進(jìn)Linq-Linq大觀園

不能不說(shuō)的C#特性-對(duì)象集合初始化器

不能不說(shuō)的C#特性-匿名類型與隱式類型局部變量

不能不說(shuō)的C#特性-擴(kuò)展方法

不能不說(shuō)的C#特性-匿名方法和Lambda表達(dá)式

不能不說(shuō)的C#特性-迭代器(上)及一些研究過(guò)程中的副產(chǎn)品

不能不說(shuō)的C#特性-迭代器(下),yield以及流的延遲計(jì)算

走進(jìn)Linq-Linq to Objects(上)基礎(chǔ)篇

走進(jìn)Linq-Linq to Objects(下)實(shí)例篇

走進(jìn)Linq-Linq to SQL感性認(rèn)識(shí)篇

走進(jìn)Linq-Linq to SQL How do I(1)

走進(jìn)Linq-Linq to SQL How do I(2)

走進(jìn)Linq-Linq to SQL How do I(3)

走進(jìn)Linq-How do I(4)拾遺補(bǔ)零篇第一節(jié)

走進(jìn)Linq-Linq to SQL源代碼賞析 Table的獲取過(guò)程

走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化

走進(jìn)Linq-Linq to SQL源代碼賞析,通過(guò)Linq to SQL看Linq


賦值符號(hào)右邊的表達(dá)式是一樣的,在第一個(gè)式子中是將Lambda表達(dá)式賦值給委托,第二個(gè)式子中將Lambda賦值給Expression,這個(gè)東西叫做表達(dá)式樹。

在第一個(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í)際上為我們做了詞法分析、語(yǔ)法分析了,在編譯原理里前兩個(gè)階段就是詞法分析和語(yǔ)法分析,詞法分析首先遍歷傳入的語(yǔ)言字符串,在我們這里就是x=>x==5,詞法分析器讀取每個(gè)字符,識(shí)別出標(biāo)識(shí)符,常量,關(guān)鍵字,運(yùn)算符,詞法分析器的產(chǎn)出是Token(符號(hào));然后語(yǔ)法分析器根據(jù)該語(yǔ)言的語(yǔ)法范式將Token組織成一個(gè)樹形結(jié)構(gòu),用這個(gè)樹形的結(jié)構(gòu)來(lái)表示該語(yǔ)言的代碼文件,在我們這里x=>x==5就是Lambda表達(dá)式這門“語(yǔ)言”的語(yǔ)句了,Expression就是那個(gè)樹)。Expression是一個(gè)遞歸形式的定義,它有兩個(gè)屬性:Parameters,這個(gè)屬性就是Lambda表達(dá)式的參數(shù),在上面的代碼中就是:x,它還有一個(gè)屬性是BodyBody也是一個(gè)Expression類型,從這里我們看到Expression是這樣遞歸下去的。

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

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

第一種:通過(guò)給IEnumerableIQueryable添加擴(kuò)展方法,這個(gè)就是利用C#語(yǔ)言的特性來(lái)達(dá)到的。我將這種擴(kuò)展稱之為橫向的擴(kuò)展。

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

小結(jié)

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

it知識(shí)庫(kù)走進(jìn)Linq-Linq to SQL源代碼賞析,通過(guò)Linq to SQL看Linq,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产ts在线 | 无码射肉在线播放视频 | 午夜福利电影网站鲁片大全 | 校草让我脱了内裤给全班看 | 伊人色综合久久天天 | 久久精选视频 | 99视频精品国产在线视频 | 国产精品无码中文在线AV | 免费视频亚洲 | 午夜免费国产体验区免费的 | 男人插曲女人下生免费大全 | 俄罗斯9一14 young处 | 9966在线观看免费高清电影 | 把她带到密室调教性奴 | 76人遣返航班上71人呈阳性 | 青青草原成人 | 久久精品亚洲热综合一本 | 在线 日韩 欧美 国产 社区 | 久久在精品线影院精品国产 | 韩国精品无码少妇在线观看网站 | 国产AV无码熟妇人妻麻豆 | 亚洲AV久久无码精品蜜桃 | 欧美残忍xxxx极端 | 精品久久久久中文字幕加勒比东京热 | 国产线精品视频在线观看 | 一个人HD在线观看免费高清视频 | 538在线视频一区二区视视频 | 国产喷水1区2区3区咪咪爱AV | 国产热久久精 | 国产精品一久久香蕉国产线看 | 日韩欧美中文字幕一区 | 影音先锋影院中文无码 | 国产精品97久久AV色婷婷 | 日韩AV成人无码久久精品老人 | 亚洲国产中文字幕新在线 | 国产三级91 | 99精品国产免费观看视频 | 2021国产精品久久久久精品免费网 | 久久综合给合久久狠狠狠… | 中俄两军在日本海等上空战略巡航 | 青青草在线 视频 |