版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
30章LanguageIntegratedQueryLINQ,是微軟在新一代的框架體系中提供的一種語言LINQ查詢功能,開發(fā)人員可以在對(duì)象領(lǐng)域和數(shù)據(jù)領(lǐng)域建立起詢。本章將從LINQ的概述、語法、應(yīng)用以及最終的應(yīng)用場景來介紹LINQ技術(shù)。LINQ查詢是通過查詢表達(dá)式完成對(duì)數(shù)據(jù)源的數(shù)據(jù)檢索功能,在.NET3.5LINQ通過提供一種跨各種數(shù)據(jù)源和數(shù)據(jù)格式使用數(shù)據(jù)的一致模型,使得在框架中進(jìn)LINQ查詢中,始終會(huì)用到對(duì)象??梢允褂孟嗤幕揪幋a模XML文檔、SQL數(shù)據(jù)庫、ADO.NET數(shù)據(jù)集、.NET集合中的數(shù)據(jù)以及對(duì)其有LINQ提供程序可用的任何其他格式的數(shù)據(jù)。技巧:LINQ查詢框架中,對(duì)象的查詢創(chuàng)建基本需要3個(gè)部分:獲取數(shù)據(jù)源、創(chuàng)建查詢LINQ查詢語法,定義本次查詢的內(nèi)容。除了查詢數(shù)據(jù)執(zhí)行查詢是指最終的查詢語句的運(yùn)行。查詢變量本身只是查詢命令,實(shí)際的查詢據(jù)庫。在應(yīng)用程序中,可以創(chuàng)建一個(gè)檢索數(shù)據(jù)的查詢,并可以按某一時(shí)間間隔反復(fù)執(zhí)LINQ查詢是一種通用的查詢語法,它可以在程序的任意邏輯中使用。本節(jié)將通過一個(gè)控制臺(tái)應(yīng)用程序來實(shí)現(xiàn)LINQ查詢的應(yīng)用介紹。創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,命名 LINQAppDemostaticstaticvoidMain(string[]{int[]numbers=newint[7]{0,1,2,3,4,5,6varnumQueryfromnuminnumbers//指定查詢對(duì)象where(num20//指定查詢條件selectnum;//選擇查詢結(jié)果foreach(intnumin{Console.Write("{0,1num);}}在上面的代碼中,首先定義了一個(gè)整型的數(shù)組對(duì)象numbers,以此作為數(shù)據(jù)源進(jìn)行后續(xù)的查詢操作。然后創(chuàng)建查詢語句,通過var定義了一個(gè)查詢語句變量numQuery。from語句后續(xù)定義了一個(gè)查詢臨時(shí)變量,用于定義數(shù)據(jù)源中的查詢臨時(shí)數(shù)據(jù)。in語句指定了查詢的被2整除。最后通過select語句將符合該條件的數(shù)據(jù)全部選擇出來,再通過foreach語句變量查詢變量對(duì)象numQuery,執(zhí)行查詢,將符合條件的查詢結(jié)果顯示到控制臺(tái)中。30.1LINQLINQ礎(chǔ)上。借助于LINQ,查詢已是高級(jí)語言構(gòu)造,就如同類、方法、事件等。對(duì)于編寫查詢的開發(fā)人員來說,LINQ最重要的部分是查詢表達(dá)式。查詢表達(dá)式是使SQL數(shù)據(jù)庫、ADO.NET數(shù)據(jù)集、XML文檔和流以及.NET集合中的數(shù)據(jù)。C#SQLXQuery說明:查詢表達(dá)式必from子句開頭,并且必須以selectgroup子句結(jié)尾。在第一個(gè)from子句和最后一個(gè)select或group子句之間,查詢表達(dá)式可以包含一個(gè)或多個(gè)可選子句,如where,orderby,join,let甚至附加的from子句。還可以使用into關(guān)joingroup子句的結(jié)果能夠充當(dāng)同一查詢表達(dá)式中附加查詢子句的源。LINQ查詢的一項(xiàng)規(guī)則,建議盡量使用查詢語法,只在必需的情況下才一個(gè)排序子句,但不對(duì)源元素進(jìn)行轉(zhuǎn)換,select子句結(jié)束了該查詢。////數(shù)據(jù)int[]scores={90,71,82,93,75,82//查詢表 //查詢變fromscoreinscoreswherescore>60fromscoreinscoreswherescore>60orderbyscoredescendingselectscore;foreach(inttestin foreachToList方法進(jìn)行轉(zhuǎn)換,IEnumerable<City>IEnumerable<City>largeCityList=(fromcountryincountriesfromcityincountry.Citieswherecity.Population>10000selectcity)詢前面的所有分?jǐn)?shù)中的最高得分,可以通過Max方法來獲取到,代碼如下:intinthighestScore(fromscoreinscoresselectscore)Select語句是用來將結(jié)果選擇出來,還可以通過groupby語句實(shí)現(xiàn)對(duì)結(jié)果進(jìn)行分組。varvarqueryCountryGroupsfromcountryincountries groupcountrybycountry.Name[0];//分組查詢結(jié)果fromcountryincountries//指定查詢對(duì)象orderbycountry.Area>500000,//指定查詢條件country.Populationdescending//查詢結(jié)果排序selectcountry; varvarcategoryQueryfromcatinjoinprodinproductsoncatequalsprod.Category//聯(lián)合查詢selectnew{Category=cat,Name=prod.Name};string[]string[]names={"firstNamelastName"};IEnumerable<string>queryFirstNames=fromnameinletfirstName=name.Split(newchar[]{''selectLINQ的查詢包括兩種基本的語法,即查詢語法和方法語法。查詢語法是指在查詢中select語句直接返回查詢列表,而方法語法是對(duì)于查詢結(jié)果的一些統(tǒng)計(jì)功能,如求和SumMaxMinAverage等。在查詢中,二者可以分別獨(dú)30.2.1節(jié)中介紹了查詢語法和方法語法的一些使用方式。本節(jié)將通過一個(gè)完整的實(shí)例介紹如何使用查詢語法和方法語法進(jìn)行LINQ的查詢。創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目,命名為QueryMethodDemo////查詢//定義數(shù)List<int>numbers=newList<int>(){5,4,1,3,9,8,6,7,2,0//定義查詢fromnuminnumbers//指定查詢對(duì)象wherenum<3||num>7//指定查詢條件select ine("查詢1結(jié)果:");foreachintintTempinfilteringQuery){ ine(intTemp);//顯示查詢結(jié)}//2,定義查詢條件IEnumerable<intorderingQueryfromnuminnumbers wherenum<3||num> orderbynum selectselectforeach(intintTempin string[] Query={"apple","banana","orange","strawberry"fromitemin<char,string>>queryFoodGroupsgroupitemby ine("3結(jié)果:");//foreach(IGrou <char,string>miinqueryFoodGroups) 該部分3個(gè)查詢?nèi)际峭ㄟ^查詢語法創(chuàng)建的查詢表達(dá)式。第1個(gè)查詢表達(dá)式演示如何通where子句應(yīng)用條件來篩選或限制結(jié)果,它返回源序列中值7或小于3的所有元素。第2個(gè)表達(dá)式演示如何對(duì)返回的結(jié)果進(jìn)行排序。第3個(gè)表達(dá)式演示如何按照鍵對(duì)結(jié)17,12,10doubleaveragenumbers1.Average(); ine("查詢4結(jié)果:"); IEnumerable<intconcatenationQuerynumbers1.Concat(numbers2); ine("查詢5結(jié)果:");foreach(intintTempinconcatenationQuery) foreachforeach(intintTempinlargeNumbersQuery) 34Average方法獲取數(shù)據(jù)源的平均值。查5Concat方法將兩個(gè)數(shù)據(jù)源進(jìn)行連接查詢。查6Where方法的lambda表達(dá)式進(jìn)行查詢。intnumCount1=(fromnuminnumbers1wherenum<3||num>7selectnum).Count();//使用查詢語法查詢結(jié)果的IEnumerable<int>numbersQuery=fromnuminnumbers1wherenum<3||num>7selectnum;intnumCount2=7屬于查詢語法和方法語法的混合查詢。Count使用的是方select37的數(shù)據(jù)30.2使用LINQ通過實(shí)例介紹如何通過LINQ實(shí)現(xiàn)數(shù)據(jù)的合并。創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,命名 MergeDataDmeoclassclass{//定義Name屬publicstringName{get;set;//定義ID屬publicintID{get;set;}class{///定義Name屬publicstringName{get;set;//定義ID屬publicintID{get;set;}創(chuàng)建第一個(gè)數(shù)據(jù)源List<A>a=new{newAID=1,newA{ID=2,newA{ID=3,newA{ID=4,List<B>b=new{newB{ID=1,Name="Mary"},newB{ID=2,Name="Jane"},newB{ID=3,Name="Kate"}SameID=Ain//指定查詢A.ID==//選擇查詢//連接查詢BinConsole.Wriine("相同ID的人//遍歷查詢foreach(varin{Console.Wriine( //選擇查詢結(jié)}30.3LINQ使用LINQLINQ不僅可以查詢數(shù)據(jù),修改查詢結(jié)果,而且可以用來完成查詢之后的數(shù)據(jù)轉(zhuǎn)換功XML格式的數(shù)據(jù)。本節(jié)將通過一個(gè)實(shí)例來介紹如何實(shí)現(xiàn)LINQ對(duì)數(shù)據(jù)的轉(zhuǎn)換。創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目,命名為ConvertDataDemoclassclass{//定義Name屬publicstringName{get;set;//定義ID屬publicintID{get;set;//定義Phones屬publicList<int>}List<A>List<A>a=new{//添加列表添加如下用于LINQ轉(zhuǎn)換的代碼:varvarAsToXML=newXElement("Root", Ainaletx=selectnewXElement("A",newnewnewXElement("Phones",//創(chuàng)建Phonesa結(jié)束"Root" 30.4LINQLINQ定義了查詢語言,它可以通過對(duì)多種數(shù)據(jù)源對(duì)象進(jìn)行查詢,從而實(shí)現(xiàn)數(shù)據(jù)的高以下4種數(shù)據(jù)源查詢的介紹,使讀者可以更深入的了解LINQ在簡單對(duì)象模型中查詢的LINQToSQLLINQtoSQL中,關(guān)系數(shù)據(jù)庫的數(shù)據(jù)模型映射到用開發(fā)人員所用的編程語言表示的然后將它們發(fā)送到數(shù)據(jù)庫進(jìn)行執(zhí)行。當(dāng)數(shù)據(jù)庫返回結(jié)果時(shí),LINQtoSQL會(huì)將它們轉(zhuǎn)換回LINQtoSQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫數(shù)據(jù)的查詢。其中的descending參數(shù)表示為倒序排列結(jié)果。注意:SQLServerExpress程序。創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,命名為LINQSqlDemo在“解決方案資源管理器”窗口中,右鍵單擊LINQSqlDemo項(xiàng)目節(jié)點(diǎn),單擊30.5DemoDataBase.mdf數(shù)據(jù)庫文件,以此30.5DemoDataBase.mdf文件,VisualStudio2008會(huì)彈出30.6所示。在彈出的創(chuàng)建數(shù)據(jù)表其中ID列為主鍵。創(chuàng)建完畢的數(shù)據(jù)表定義如圖30.7所示。圖30.6添加數(shù)據(jù)庫新 圖30.7定義數(shù)據(jù)庫新單擊菜單欄的“保存”按鈕,在彈出的“選擇名稱”框中,輸入表的名稱DemoTable菜單。在彈出的表內(nèi)容中,輸入實(shí)例數(shù)據(jù),數(shù)據(jù)內(nèi)容如表30.1所示。30.1DemoTable1234567[Table(Name[Table(Name="DemoTable")]publicclass{privateint[Column(Name="ID")]publicintID{ ID屬{return}////設(shè)置ID{this._ID=}}privatestring[Column(Name="Name")]publicstringName{ Name{return}//設(shè)置Name{this._Name=}}privatebool[Column(Name="Sex")]publicboolSex{ Sex{return}//設(shè)置Sex{this._Sex=}}}在代碼中,定義了一個(gè)類,并使用了屬性[Table(Name="DemoTable")]來表明該類對(duì)應(yīng)的數(shù)據(jù)庫表名稱。同樣,在類中定義了3個(gè)私有字段和3個(gè)公有屬性。每個(gè)公有屬性都通過[Column(Name="××")]的語法進(jìn)行標(biāo)注,表明該屬性對(duì)應(yīng)的是數(shù)據(jù)表的某一staticstaticvoidMain(string[]{//定義數(shù) ontextdb=new(@"E:\Visual(@"E:\VisualStudio2008//>s=db.Log=>custQuerys.Sex==;foreach({ine("共查詢{0}個(gè)結(jié)果", custin ine("ID={0},Name={1}",cust.ID,cust.Name);}}注意:代碼中的DemoDataBase.mdf文件的路徑應(yīng)隨著文件所在 本實(shí)例中的路徑為運(yùn)行實(shí)例時(shí)mdf文件所在的 代碼中,首先通過Dontext類定義了一個(gè)用于數(shù)據(jù)庫連接的實(shí)例,然后通過GetTable方法獲取數(shù)據(jù)表對(duì)應(yīng)的對(duì)象IQueryable接口定義查詢變量,然后通LINQ查詢語法構(gòu)建查詢表達(dá)式,最后通過foreach遍歷查詢的結(jié)果。30.8LINQToSQLLINQToDataSetLINQtoDataSetDataSet對(duì)象中緩存的數(shù)據(jù),使開發(fā)人員能夠使用編程語言本身而不是通過使用單獨(dú)的查詢語言來編寫查詢,因?yàn)長INQtoDataSet可以簡化查詢。LINQtoDataSet也可用于查詢從一個(gè)或多個(gè)數(shù)據(jù)源合并的數(shù)據(jù)?,F(xiàn)LINQtoDataSet應(yīng)用。創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,命名 LINQToADODemoprivateprivatestaticDataSetDataSetret=newDataTabledataTable=newdataTable.Columns.Add(newDdataTable.Columns.Add(newDolumn("Name",olumn("Sex",for(intDataRownewRow=dataTable.NewRow();//定義新行newRow["ID"]=n; //添加ID值newRow["Name"]="Name"+n.ToString();//添加Name值newRow["Sex"]=newRow["Sex"]=false;returngetDataSet方法用于在內(nèi)存中構(gòu)建一個(gè)數(shù)據(jù)集對(duì)象,然后在該數(shù)據(jù)集中添加一個(gè)數(shù)據(jù)表,同時(shí)在表中添加10行數(shù)據(jù),用于后續(xù)查詢操作。staticstaticvoidMain(string[]{DataSetds=varquery=s=.Field<bool>("Sextrue//selectnew//{ID Name= Sex= foreach(varitemin{ ine("ID:{0}Name:{1}Sex:{2}",}}whereSexSelect語句,將查詢結(jié)果創(chuàng)建到一個(gè)對(duì)象查詢變量中,然后通過foreach語句,執(zhí)行該LINQ查詢。30.9LINQToDataSetLINQToXML在很多環(huán)境中,XML已廣泛采用為格式化數(shù)據(jù)的方式。在Web上,在配置文件、OfficeWord文件以及數(shù)據(jù)庫中,都可以XML。LINQtoXML經(jīng)過了重新設(shè)計(jì),是的XML編程方法。它提供文檔對(duì)象模型的內(nèi)存文檔修改功能,支持LINQ查創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,命名 LINQXMLDemo該XML文件的內(nèi)容如下代碼所示。 staticstaticvoidMain(string[]{//加載XMLXElementroot=//定義數(shù)據(jù)查詢fromelinletprice(decimal)el.Element("Price指定查詢條
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工合同樣本:學(xué)校建設(shè)協(xié)議
- 電力公司供水管道鋪設(shè)項(xiàng)目合同
- 城市環(huán)保光纖布線合同
- 智能辦公監(jiān)控系統(tǒng)施工協(xié)議
- 交通運(yùn)輸服務(wù)招投標(biāo)合同模板
- 宿舍區(qū)消防演練計(jì)劃
- 社團(tuán)投資管理規(guī)范
- 制造業(yè)臨時(shí)工薪資發(fā)放規(guī)范
- 南寧市物業(yè)安全隱患排查
- 皮具店防火門安裝協(xié)議
- 河南省信陽市2024-2025學(xué)年七年級(jí)上學(xué)期期中歷史試題(含答案)
- 2024至2030年高分子吸水樹脂項(xiàng)目投資價(jià)值分析報(bào)告
- 期中測試卷(1-5單元)(試題)-2024-2025學(xué)年三年級(jí)上冊(cè)數(shù)學(xué)人教版
- 中國航空協(xié)會(huì):2024低空經(jīng)濟(jì)場景白皮書
- DB11T 731-2010 室外照明干擾光限制規(guī)范
- 2024年學(xué)校食堂管理工作計(jì)劃(六篇)
- 學(xué)校食堂消毒記錄
- 塔吊使用安全協(xié)議書
- 中國近代史綱要試題及答案(全套)
- 民辦非企業(yè)單位理事會(huì)制度
- 地 理氣溫的變化和分布課時(shí)1課件-2024-2025學(xué)年七年級(jí)地理上冊(cè)(人教版2024)
評(píng)論
0/150
提交評(píng)論