|
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的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)識篇
走進(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
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
某日編程大師云游到某處,見一剛畢業(yè)不久學(xué)過兩天C#和兩天SQL的coder在那里發(fā)牢騷,為啥我要寫這么多for,這么多if才能查詢出我需要的數(shù)據(jù),為啥我不能像SQL那樣,發(fā)送一條命令告訴數(shù)據(jù)庫我需要啥樣的數(shù)據(jù),它就給我返回來。
編程大師如是說:傻小子,像SQL那叫第四代編程語言,常存在于象牙塔和研究所里面的學(xué)究語言,還有個高雅的名字:函數(shù)編程。它只需要你告訴它要什么,而不需要告訴它怎么做。而你使用的C#語言屬于命令式編程,你必須像發(fā)送命令一樣一步步的告訴你的機(jī)器怎么做。
發(fā)牢騷的coder回了一句:不懂,我只是想不通,數(shù)據(jù)庫能做這樣的處理,為啥C#這么牛的語言不能呢。編程大師心里想著:這是不可能的事情,因?yàn)镃#它是強(qiáng)類型語言,)*&)(&)*)()*&%&%&^(后面省去200字)。
天色還未晚,編程大師就急匆匆的回家了,他心里一直記著那位發(fā)牢騷的coder的話:為什么不能,為什么不能。
晚上,編程大師做了一個夢,一個奇怪的夢,他的師傅“白眉”只說了三個字母:DSL。
編程大師想著,DSL,領(lǐng)域?qū)S谜Z言,師傅要對我說什么呢,難道和今天我遇見的事有關(guān)?
上面這段文字是一段調(diào)侃,調(diào)節(jié)一下氣氛,呵呵。
我覺得Linq就是一種DSL,在C#等常規(guī)語言上抽象起來的,面向數(shù)據(jù)處理領(lǐng)域的特定“語言”,當(dāng)然,它的根基還是這些常規(guī)語言。
select,from,where,group等關(guān)鍵字本來只是在SQL里出現(xiàn),現(xiàn)在把它們引入到C#這些常規(guī)編程語言中。
那C#等是如何做到的呢?是在CLR底層支持的么?不是。既然“編譯器”可以將C#編譯成MSIL,那為什么編譯不能干更多一點(diǎn)事情?將這些為了領(lǐng)域編程而出現(xiàn)關(guān)鍵字編譯成原始語法。
下面還是從實(shí)例來說明吧:
我們有一個圖書類Book,先已經(jīng)有一個填充有數(shù)據(jù)的Book集合,我們需要從這個集合里查找出單價小于50的書籍:























系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的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)識篇
走進(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
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
如是我可以寫這樣的代碼:
public static class Helper{
public static IList<Book> SearchBookByPrice()
{
IList<Book> books = //

IList<Book> results = new List<Book>();
foreach(Book book in books)
{
if(book.Price < 50)
{
results.Add(book);
}
}
return results;
}
}
系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的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)識篇
走進(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
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
我們將查詢條件使用委托解決了,只要傳遞一個接收Book作為參數(shù),返回bool值的方法進(jìn)去就可以查詢滿足條件的書籍了,但是,為了這個委托,我們還得先定義一個新方法,然后。。。。太麻煩了,為此C# 2.0為我們提供了匿名方法,專門針對這些只有“一句話方法”:
IList<Book> results = Helper.SearchBook(delegate(Book book) { return book.Title == "yuyi"; });系列文章導(dǎo)航:
不能不說的C#特性-迭代器(上)及一些研究過程中的副產(chǎn)品
不能不說的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)識篇
走進(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
走進(jìn)Linq-Linq to SQL源代碼賞析之Provider的初始化
走進(jìn)Linq-Linq to SQL源代碼賞析,通過Linq to SQL看Linq
仔細(xì)比較一下這個實(shí)現(xiàn)與剛才的實(shí)現(xiàn)有何不同(我們還給它起了一個更好聽的名字Where,是不是和SQL更像了),現(xiàn)在我們可以這樣調(diào)用了:
IList<Book> results = books.Where(book => book.Title == "yuyi");it知識庫:走進(jìn)Linq--Linq橫空出世篇,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。