一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

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

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

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

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

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

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

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

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

走進Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進Linq-Linq to SQL源代碼賞析之Provider的初始化

走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


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

在上兩章里面我們通過源代碼探討了關于DataContext的初始化和Table<TEntity>對象的獲取,以及Provider的初始化。今天我們來看看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);
}

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

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

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

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

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

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

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

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

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

走進Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進Linq-Linq to SQL源代碼賞析之Provider的初始化

走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


 

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

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

系列文章導航:

走進Linq--Linq橫空出世篇

走進Linq-輝煌的背后

走進Linq-Linq大觀園

不能不說的C#特性-對象集合初始化器

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

不能不說的C#特性-擴展方法

不能不說的C#特性-匿名方法和Lambda表達式

不能不說的C#特性-迭代器(上)及一些研究過程中的副產品

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

走進Linq-Linq to Objects(上)基礎篇

走進Linq-Linq to Objects(下)實例篇

走進Linq-Linq to SQL感性認識篇

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

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

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

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

走進Linq-Linq to SQL源代碼賞析 Table的獲取過程

走進Linq-Linq to SQL源代碼賞析之Provider的初始化

走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq


賦值符號右邊的表達式是一樣的,在第一個式子中是將Lambda表達式賦值給委托,第二個式子中將Lambda賦值給Expression,這個東西叫做表達式樹。

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

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

看到這個圖,那我們有幾種擴展Linq的方式呢?

第一種:通過給IEnumerableIQueryable添加擴展方法,這個就是利用C#語言的特性來達到的。我將這種擴展稱之為橫向的擴展。

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

小結

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

it知識庫走進Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq,轉載需保留來源!

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

主站蜘蛛池模板: 国产精品久久久久桃色tv | 一级囗交片 | 久视频在线观看 | 五月天色婷婷综合 | 伊人精品网 | 最新欧美精品一区二区三区 | 精品少妇一区二区三区视频 | 女人被爽到呻吟娇喘的视频动态图 | 99久女女精品视频在线观看 | 日本一区二区视频免费播放 | 一道本色 | 国产在线精品一区二区 | 在线观看黄网视频免费播放 | 日韩高清一区二区 | 国产色婷婷免费视频 | 99精品久久久久久久婷婷 | 国产99久久久久久免费看 | aⅴ一区二区三区 | 国内精品免费麻豆网站91麻豆 | 91国内在线国内在线播放 | 激情小说激情图片 | 久久五月激情婷婷日韩 | 超级香蕉97视频在线观看一区 | 香蕉视频成人在线观看 | 黄视频网站在线观看 | 最近手机中文字幕1页 | 久久免费公开视频 | 五月婷六月婷婷 | 日韩精品永久免费播放平台 | 亚洲成人福利在线观看 | 精彩视频一区二区三区 | 亚洲午夜免费视频 | 四虎影视色费永久在线观看 | 日本视频www色变态 日本视频网站在线www色 | 亚洲国产精品日韩高清秒播 | fefe66免费毛片你懂的 | 涩涩涩涩| 国产一区二区自拍视频 | 青草碰人人澡人人澡 | 成年美女黄网站色 | 四虎影在线永久免费观看 |