摘 要:LINQ,語(yǔ)言級(jí)集成查詢(Language Integrated Query),是一種數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),LINQ提供了一條更常的途徑,.Net Framework添加一些可以應(yīng)用于所有信息源的具有多種用途的語(yǔ)法查詢特性,這是比向開(kāi)發(fā)語(yǔ)言和運(yùn)行時(shí)添加一些關(guān)系數(shù)據(jù)特性或者類(lèi)似XML特性更好的方式。
關(guān)鍵詞:LINQ;查詢;ADO.NET;DataSet;SQL
中圖分類(lèi)號(hào):TP311.13
LINQ是Language Integrated Query的簡(jiǎn)稱,它是集成在.NET編程語(yǔ)言中的一種特性。已成為編程語(yǔ)言的一個(gè)組成部分,在編寫(xiě)程序時(shí)可以得到很好的編譯時(shí)語(yǔ)法檢查、豐富的元數(shù)據(jù)、智能感知、靜態(tài)類(lèi)型等強(qiáng)類(lèi)型語(yǔ)言的好處。并且它同時(shí)還使得查詢可以方便地對(duì)內(nèi)存中的信息進(jìn)行查詢而不僅僅只是外部數(shù)據(jù)源。
1 LINQ的基本語(yǔ)法
在.NET框架中,LINQ包含在System.Linq命名空間內(nèi),它的基本語(yǔ)法結(jié)構(gòu)為:
<結(jié)果類(lèi)型> <查詢結(jié)果對(duì)象>=
from <范圍變量> in <數(shù)據(jù)源>
[where <布爾表達(dá)式>]
[orderby <排序關(guān)鍵字>][ascending|descending]
[group <范圍變量> by <分組關(guān)鍵字> into <分組標(biāo)識(shí)符>]
[join <范圍變量> in <連接數(shù)據(jù)源> on <連接條件>]
select <查詢結(jié)果>
通常<結(jié)果類(lèi)型>使用var關(guān)鍵字讓系統(tǒng)編譯器在編譯時(shí)推斷查詢變量的類(lèi)型,也可以使用查詢變量的顯示類(lèi)型來(lái)指定查詢結(jié)果類(lèi)型。
from子句用于指定“范圍變量”及“數(shù)據(jù)源”,“范圍變量”用于每個(gè)數(shù)據(jù)源對(duì)象的引用,數(shù)據(jù)源可以是各種內(nèi)存數(shù)據(jù)。
where子句用于查詢結(jié)果的篩選。
orderby子句用于查詢結(jié)果排序。
groupby子句用于查詢結(jié)果的分組,查詢結(jié)果的每個(gè)元素是一個(gè)具有鍵值對(duì)象及根據(jù)該鍵分組的元素列表的對(duì)象。在循環(huán)訪問(wèn)生成組序列的查詢時(shí),必須使用嵌套的循環(huán),外部循環(huán)用于循環(huán)訪問(wèn)每個(gè)組,內(nèi)部循環(huán)用于訪問(wèn)每個(gè)組所對(duì)應(yīng)的元素列表的對(duì)象。
joinon子句用于將指定的鍵來(lái)做關(guān)聯(lián)操作。
select子句用于從容器中選擇一個(gè)序列。
2 LINQ查詢
LINQ查詢通過(guò)提供一種跨各種數(shù)據(jù)源和數(shù)據(jù)格式使用數(shù)據(jù)的一致模型,簡(jiǎn)化了查詢過(guò)程。LINQ查詢分為對(duì)內(nèi)存對(duì)象的查詢(LINQ to Object)、對(duì)SQL Server數(shù)據(jù)庫(kù)的查詢(LINQ to SQL)、對(duì)ADO.NET DataSet的查詢(LINQ to DataSet)、對(duì)XML數(shù)據(jù)的查詢(LINQ to XML)以及對(duì)由ADO.NET實(shí)體框架創(chuàng)建的實(shí)體集進(jìn)行查詢(LINQ to Entities)。
2.1 LINQ to Object。LINQ to Object直接對(duì)任意IEnumerable或IEnumerable
2.2 LINQ to SQL。在LINQ to SQL中,關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)模型映射到開(kāi)發(fā)人員所用的編程語(yǔ)言表示的對(duì)象模型。當(dāng)應(yīng)用程序運(yùn)行時(shí),LINQ to SQL會(huì)將對(duì)象模型中的語(yǔ)言集成查詢轉(zhuǎn)換為SQL。然后將它們發(fā)送到數(shù)據(jù)庫(kù)進(jìn)行執(zhí)行。當(dāng)數(shù)據(jù)庫(kù)返回結(jié)果時(shí),LINQ to SQL會(huì)將它們轉(zhuǎn)換回開(kāi)發(fā)人員所用的編程語(yǔ)言處理的對(duì)象。
2.3 LINQ to DataSet。使用LINQ to DataSet時(shí),使用本質(zhì)上和查詢對(duì)象集合相同的語(yǔ)法。畢竟,DataSet其實(shí)只是一組DataTable實(shí)例,而DataTable是一組DataRow對(duì)象。但是,對(duì)DataSet有一個(gè)明顯的限制—它沒(méi)有顯示強(qiáng)類(lèi)型數(shù)據(jù)。相反,要使用Field
2.4 LINQ to XML。LINQ to XML是一種啟用了LINQ的內(nèi)存XML編程接口,可以在.NET Framework編程語(yǔ)言中處理XML。它將XML文檔置于內(nèi)存中,這一點(diǎn)很像文檔對(duì)象模型(DOM)??梢圆樵兒托薷腦ML文檔。但是,LINQ to XML與DOM不同:它提供一種使用方便,更輕量的對(duì)象模型。
2.5 LINQ to Entities。LINQ to Entities是Entity Framework的一部分并且取代LINQ to SQL作為在數(shù)據(jù)庫(kù)上使用LINQ的標(biāo)準(zhǔn)機(jī)制。Entity Framework是行業(yè)領(lǐng)先的對(duì)象—關(guān)系映射(ORM)系統(tǒng),可以和多種數(shù)據(jù)庫(kù)一起使用,并支持各種靈活、復(fù)雜的數(shù)據(jù)模型。LINQ to Entities作為Entity Framework的一部分,它可以使用Entity Framework數(shù)據(jù)模型來(lái)執(zhí)行LINQ查詢。
3 LINQ應(yīng)用實(shí)例
下面以實(shí)例—城市Bothell街道信息查詢說(shuō)明LINQ查詢的應(yīng)用,部分程序代碼如下:
DataContextClassesDataContext db = new DataContextClassesDataContext();
Table
Addresses = db.GetTable();db.Log = Console.Out;
IQueryable
addrQuery =from addr in Addresses
where addr.City == \"Bothell\"
select addr;
foreach (Address addr in addrQuery)
{
Console.WriteLine(\"AddressID={0},AddressLine={1}\",addr.AddressID,addr.AddressLine1);
}
在代碼中,變量Addresses則為System.Data.Linq命名空間中的Table類(lèi)對(duì)象,相當(dāng)于數(shù)據(jù)庫(kù)中的數(shù)據(jù)表,變量addrQuery則是查詢結(jié)果集,addr.City則是查詢條件。
4 結(jié)束語(yǔ)
綜上所述,使用LINQ數(shù)據(jù)庫(kù)訪問(wèn)技術(shù),可以直接通過(guò)編程語(yǔ)言查詢和操作內(nèi)存數(shù)據(jù)、關(guān)系數(shù)據(jù)、XML文檔和實(shí)體數(shù)據(jù),使得對(duì)數(shù)據(jù)的查詢和操作更簡(jiǎn)便。使用LINQ技術(shù)無(wú)需使用復(fù)雜的編程技巧就可合并數(shù)據(jù)源,讓開(kāi)發(fā)者的開(kāi)發(fā)效率更大地提高。
參考文獻(xiàn):
[1]田江.淺談LINQ訪問(wèn)技術(shù)[J].科教文匯,2009(21):275.
[2]韓雙旺.淺談LINQ數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)研究[J].自動(dòng)化與儀器儀表,2011(04):13.
[3]馬鵬烜.基于LINQ to Entity數(shù)據(jù)訪問(wèn)技術(shù)的應(yīng)用研究[J].現(xiàn)代計(jì)算機(jī),2011,7(05):11.
[4](美)謝菲爾德(Shepherd,G.)著,張大威譯.ASP.NET 4從入門(mén)到精通[M].北京:清華大學(xué)出版社,2011.
[5](美)麥克唐納(MacDonald,M.),(美)弗里曼(Freeman,A.),(美)茲普茲塔(Szpuszta,M.)著.博思工作室譯.ASP.NET 4高級(jí)程序設(shè)計(jì)(第4版)[M].北京:人民郵電出版社,2011.
[6](美)特羅爾森(Troelsen,A.)著,朱曄等譯.C#與.NET 4高級(jí)程序設(shè)計(jì)(第5版)[M].北京:人民郵電出版社,2011.
作者簡(jiǎn)介:唐磊(1983-),男,重慶萬(wàn)州人,現(xiàn)就職于現(xiàn)代教育技術(shù)中心,助教,主要研究方向:計(jì)算機(jī)網(wǎng)絡(luò)及軟件開(kāi)發(fā)。
作者單位:重慶三峽職業(yè)學(xué)院,重慶 404155