編程專題講座-c開發(fā)技術第30章wpf框架_第1頁
編程專題講座-c開發(fā)技術第30章wpf框架_第2頁
編程專題講座-c開發(fā)技術第30章wpf框架_第3頁
編程專題講座-c開發(fā)技術第30章wpf框架_第4頁
編程專題講座-c開發(fā)技術第30章wpf框架_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

30章LanguageIntegratedQueryLINQ,是微軟在新一代的框架體系中提供的一種語言LINQ查詢功能,開發(fā)人員可以在對象領域和數(shù)據(jù)領域建立起詢。本章將從LINQ的概述、語法、應用以及最終的應用場景來介紹LINQ技術。LINQ查詢是通過查詢表達式完成對數(shù)據(jù)源的數(shù)據(jù)檢索功能,在.NET3.5LINQ通過提供一種跨各種數(shù)據(jù)源和數(shù)據(jù)格式使用數(shù)據(jù)的一致模型,使得在框架中進LINQ查詢中,始終會用到對象??梢允褂孟嗤幕揪幋a模XML文檔、SQL數(shù)據(jù)庫、ADO.NET數(shù)據(jù)集、.NET集合中的數(shù)據(jù)以及對其有LINQ提供程序可用的任何其他格式的數(shù)據(jù)。技巧:LINQ查詢框架中,對象的查詢創(chuàng)建基本需要3個部分:獲取數(shù)據(jù)源、創(chuàng)建查詢LINQ查詢語法,定義本次查詢的內容。除了查詢數(shù)據(jù)執(zhí)行查詢是指最終的查詢語句的運行。查詢變量本身只是查詢命令,實際的查詢據(jù)庫。在應用程序中,可以創(chuàng)建一個檢索數(shù)據(jù)的查詢,并可以按某一時間間隔反復執(zhí)LINQ查詢是一種通用的查詢語法,它可以在程序的任意邏輯中使用。本節(jié)將通過一個控制臺應用程序來實現(xiàn)LINQ查詢的應用介紹。創(chuàng)建一個控制臺應用程序,命名 LINQAppDemostaticstaticvoidMain(string[]{int[]numbers=newint[7]{0,1,2,3,4,5,6varnumQueryfromnuminnumbers//指定查詢對象where(num20//指定查詢條件selectnum;//選擇查詢結果foreach(intnumin{Console.Write("{0,1num);}}在上面的代碼中,首先定義了一個整型的數(shù)組對象numbers,以此作為數(shù)據(jù)源進行后續(xù)的查詢操作。然后創(chuàng)建查詢語句,通過var定義了一個查詢語句變量numQuery。from語句后續(xù)定義了一個查詢臨時變量,用于定義數(shù)據(jù)源中的查詢臨時數(shù)據(jù)。in語句指定了查詢的被2整除。最后通過select語句將符合該條件的數(shù)據(jù)全部選擇出來,再通過foreach語句變量查詢變量對象numQuery,執(zhí)行查詢,將符合條件的查詢結果顯示到控制臺中。30.1LINQLINQ礎上。借助于LINQ,查詢已是高級語言構造,就如同類、方法、事件等。對于編寫查詢的開發(fā)人員來說,LINQ最重要的部分是查詢表達式。查詢表達式是使SQL數(shù)據(jù)庫、ADO.NET數(shù)據(jù)集、XML文檔和流以及.NET集合中的數(shù)據(jù)。C#SQLXQuery說明:查詢表達式必from子句開頭,并且必須以selectgroup子句結尾。在第一個from子句和最后一個select或group子句之間,查詢表達式可以包含一個或多個可選子句,如where,orderby,join,let甚至附加的from子句。還可以使用into關joingroup子句的結果能夠充當同一查詢表達式中附加查詢子句的源。LINQ查詢的一項規(guī)則,建議盡量使用查詢語法,只在必需的情況下才一個排序子句,但不對源元素進行轉換,select子句結束了該查詢。////數(shù)據(jù)int[]scores={90,71,82,93,75,82//查詢表 //查詢變fromscoreinscoreswherescore>60fromscoreinscoreswherescore>60orderbyscoredescendingselectscore;foreach(inttestin foreachToList方法進行轉換,IEnumerable<City>IEnumerable<City>largeCityList=(fromcountryincountriesfromcityincountry.Citieswherecity.Population>10000selectcity)詢前面的所有分數(shù)中的最高得分,可以通過Max方法來獲取到,代碼如下:intinthighestScore(fromscoreinscoresselectscore)Select語句是用來將結果選擇出來,還可以通過groupby語句實現(xiàn)對結果進行分組。varvarqueryCountryGroupsfromcountryincountries groupcountrybycountry.Name[0];//分組查詢結果fromcountryincountries//指定查詢對象orderbycountry.Area>500000,//指定查詢條件country.Populationdescending//查詢結果排序selectcountry; varvarcategoryQueryfromcatinjoinprodinproductsoncatequalsprod.Category//聯(lián)合查詢selectnew{Category=cat,Name=prod.Name};string[]string[]names={"firstNamelastName"};IEnumerable<string>queryFirstNames=fromnameinletfirstName=name.Split(newchar[]{''selectLINQ的查詢包括兩種基本的語法,即查詢語法和方法語法。查詢語法是指在查詢中select語句直接返回查詢列表,而方法語法是對于查詢結果的一些統(tǒng)計功能,如求和SumMaxMinAverage等。在查詢中,二者可以分別獨30.2.1節(jié)中介紹了查詢語法和方法語法的一些使用方式。本節(jié)將通過一個完整的實例介紹如何使用查詢語法和方法語法進行LINQ的查詢。創(chuàng)建一個控制臺項目,命名為QueryMethodDemo////查詢//定義數(shù)List<int>numbers=newList<int>(){5,4,1,3,9,8,6,7,2,0//定義查詢fromnuminnumbers//指定查詢對象wherenum<3||num>7//指定查詢條件select ine("查詢1結果:");foreachintintTempinfilteringQuery){ ine(intTemp);//顯示查詢結}//2,定義查詢條件IEnumerable<intorderingQueryfromnuminnumbers wherenum<3||num> orderbynum selectselectforeach(intintTempin string[] Query={"apple","banana","orange","strawberry"fromitemin<char,string>>queryFoodGroupsgroupitemby ine("3結果:");//foreach(IGrou <char,string>miinqueryFoodGroups) 該部分3個查詢全都是通過查詢語法創(chuàng)建的查詢表達式。第1個查詢表達式演示如何通where子句應用條件來篩選或限制結果,它返回源序列中值7或小于3的所有元素。第2個表達式演示如何對返回的結果進行排序。第3個表達式演示如何按照鍵對結17,12,10doubleaveragenumbers1.Average(); ine("查詢4結果:"); IEnumerable<intconcatenationQuerynumbers1.Concat(numbers2); ine("查詢5結果:");foreach(intintTempinconcatenationQuery) foreachforeach(intintTempinlargeNumbersQuery) 34Average方法獲取數(shù)據(jù)源的平均值。查5Concat方法將兩個數(shù)據(jù)源進行連接查詢。查6Where方法的lambda表達式進行查詢。intnumCount1=(fromnuminnumbers1wherenum<3||num>7selectnum).Count();//使用查詢語法查詢結果的IEnumerable<int>numbersQuery=fromnuminnumbers1wherenum<3||num>7selectnum;intnumCount2=7屬于查詢語法和方法語法的混合查詢。Count使用的是方select37的數(shù)據(jù)30.2使用LINQ通過實例介紹如何通過LINQ實現(xiàn)數(shù)據(jù)的合并。創(chuàng)建一個控制臺應用程序,命名 MergeDataDmeoclassclass{//定義Name屬publicstringName{get;set;//定義ID屬publicintID{get;set;}class{///定義Name屬publicstringName{get;set;//定義ID屬publicintID{get;set;}創(chuàng)建第一個數(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( //選擇查詢結}30.3LINQ使用LINQLINQ不僅可以查詢數(shù)據(jù),修改查詢結果,而且可以用來完成查詢之后的數(shù)據(jù)轉換功XML格式的數(shù)據(jù)。本節(jié)將通過一個實例來介紹如何實現(xiàn)LINQ對數(shù)據(jù)的轉換。創(chuàng)建一個控制臺項目,命名為ConvertDataDemoclassclass{//定義Name屬publicstringName{get;set;//定義ID屬publicintID{get;set;//定義Phones屬publicList<int>}List<A>List<A>a=new{//添加列表添加如下用于LINQ轉換的代碼:varvarAsToXML=newXElement("Root", Ainaletx=selectnewXElement("A",newnewnewXElement("Phones",//創(chuàng)建Phonesa結束"Root" 30.4LINQLINQ定義了查詢語言,它可以通過對多種數(shù)據(jù)源對象進行查詢,從而實現(xiàn)數(shù)據(jù)的高以下4種數(shù)據(jù)源查詢的介紹,使讀者可以更深入的了解LINQ在簡單對象模型中查詢的LINQToSQLLINQtoSQL中,關系數(shù)據(jù)庫的數(shù)據(jù)模型映射到用開發(fā)人員所用的編程語言表示的然后將它們發(fā)送到數(shù)據(jù)庫進行執(zhí)行。當數(shù)據(jù)庫返回結果時,LINQtoSQL會將它們轉換回LINQtoSQL實現(xiàn)對數(shù)據(jù)庫數(shù)據(jù)的查詢。其中的descending參數(shù)表示為倒序排列結果。注意:SQLServerExpress程序。創(chuàng)建一個控制臺應用程序,命名為LINQSqlDemo在“解決方案資源管理器”窗口中,右鍵單擊LINQSqlDemo項目節(jié)點,單擊30.5DemoDataBase.mdf數(shù)據(jù)庫文件,以此30.5DemoDataBase.mdf文件,VisualStudio2008會彈出30.6所示。在彈出的創(chuàng)建數(shù)據(jù)表其中ID列為主鍵。創(chuàng)建完畢的數(shù)據(jù)表定義如圖30.7所示。圖30.6添加數(shù)據(jù)庫新 圖30.7定義數(shù)據(jù)庫新單擊菜單欄的“保存”按鈕,在彈出的“選擇名稱”框中,輸入表的名稱DemoTable菜單。在彈出的表內容中,輸入實例數(shù)據(jù),數(shù)據(jù)內容如表30.1所示。30.1DemoTable1234567[Table(Name[Table(Name="DemoTable")]publicclass{privateint[Column(Name="ID")]publicintID{ ID屬{return}////設置ID{this._ID=}}privatestring[Column(Name="Name")]publicstringName{ Name{return}//設置Name{this._Name=}}privatebool[Column(Name="Sex")]publicboolSex{ Sex{return}//設置Sex{this._Sex=}}}在代碼中,定義了一個類,并使用了屬性[Table(Name="DemoTable")]來表明該類對應的數(shù)據(jù)庫表名稱。同樣,在類中定義了3個私有字段和3個公有屬性。每個公有屬性都通過[Column(Name="××")]的語法進行標注,表明該屬性對應的是數(shù)據(jù)表的某一staticstaticvoidMain(string[]{//定義數(shù) ontextdb=new(@"E:\Visual(@"E:\VisualStudio2008//>s=db.Log=>custQuerys.Sex==;foreach({ine("共查詢{0}個結果", custin ine("ID={0},Name={1}",cust.ID,cust.Name);}}注意:代碼中的DemoDataBase.mdf文件的路徑應隨著文件所在 本實例中的路徑為運行實例時mdf文件所在的 代碼中,首先通過Dontext類定義了一個用于數(shù)據(jù)庫連接的實例,然后通過GetTable方法獲取數(shù)據(jù)表對應的對象IQueryable接口定義查詢變量,然后通LINQ查詢語法構建查詢表達式,最后通過foreach遍歷查詢的結果。30.8LINQToSQLLINQToDataSetLINQtoDataSetDataSet對象中緩存的數(shù)據(jù),使開發(fā)人員能夠使用編程語言本身而不是通過使用單獨的查詢語言來編寫查詢,因為LINQtoDataSet可以簡化查詢。LINQtoDataSet也可用于查詢從一個或多個數(shù)據(jù)源合并的數(shù)據(jù)。現(xiàn)LINQtoDataSet應用。創(chuà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方法用于在內存中構建一個數(shù)據(jù)集對象,然后在該數(shù)據(jù)集中添加一個數(shù)據(jù)表,同時在表中添加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語句,將查詢結果創(chuàng)建到一個對象查詢變量中,然后通過foreach語句,執(zhí)行該LINQ查詢。30.9LINQToDataSetLINQToXML在很多環(huán)境中,XML已廣泛采用為格式化數(shù)據(jù)的方式。在Web上,在配置文件、OfficeWord文件以及數(shù)據(jù)庫中,都可以XML。LINQtoXML經(jīng)過了重新設計,是的XML編程方法。它提供文檔對象模型的內存文檔修改功能,支持LINQ查創(chuàng)建一個控制臺應用程序,命名 LINQXMLDemo該XML文件的內容如下代碼所示。 staticstaticvoidMain(string[]{//加載XMLXElementroot=//定義數(shù)據(jù)查詢fromelinletprice(decimal)el.Element("Price指定查詢條

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論