編程專題講座-開發(fā)技術(shù)第20章3.5與linq_第1頁
編程專題講座-開發(fā)技術(shù)第20章3.5與linq_第2頁
編程專題講座-開發(fā)技術(shù)第20章3.5與linq_第3頁
編程專題講座-開發(fā)技術(shù)第20章3.5與linq_第4頁
編程專題講座-開發(fā)技術(shù)第20章3.5與linq_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

20ASP.NET3.5的,面向?qū)ο蠓椒ㄕ摕o法從根本意義上解決其復雜度和難度,而LINQ提供了一種更已經(jīng)無法很好的完成工業(yè)的要求時,就會促發(fā)新技術(shù)的誕生。LINQ就是為了解決復雜的LINQ從傳統(tǒng)的意義上來說,面向過程的編程模型在數(shù)據(jù)和整合的能力上有一定的限的編程語言需要對數(shù)據(jù)庫進行時,就需要編寫量的額外代碼。雖然面向過程的編程模型可以通過良好的函數(shù)和編碼提高復用性,是并沒有解決面向過程編程模型中對數(shù)據(jù)的和整合復雜度。面向?qū)ο缶幊棠P椭械呐缮?、繼承等特性同樣能夠極大地提高代碼的復用性,提升開發(fā)效率。需要通過繁瑣的進行數(shù)據(jù)庫的和數(shù)據(jù)整合。在.NET3.0框架或更早,LINQ就已經(jīng)被提及,LINQ是一種能夠快速對大部分數(shù)據(jù)源進行和數(shù)據(jù)整合的一種技術(shù),LINQ數(shù)據(jù)庫的研發(fā),但是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在還是應(yīng)用最為廣泛的。關(guān)系型數(shù)據(jù)庫中將要使用到多個數(shù)據(jù)庫或者數(shù)據(jù)描述形式的文件時,的情況是將這些數(shù)據(jù)填充到數(shù)據(jù)集LINQ能夠很方便地進行數(shù)據(jù)的查詢,使用LINQ對數(shù)據(jù)集進行查詢的形式很像使用SQL語句對數(shù)據(jù)庫中的表進行查詢,而與之不同的是,LINQ能夠面向的對象,這些對象包括數(shù)組、集合以及數(shù)據(jù)庫,LINQ對數(shù)組的查詢示例代碼如下所示。staticstaticvoidMain(string[]stringstr你好","今天的","天氣真不錯","生活很陽光"};//創(chuàng)建數(shù)組vars=fromninstrselectn;foreach(varnin strSQL語句。的確,LINQ的查詢方式staticstaticvoidMain(string[]stringstr你好","今天的","天氣真不錯","生活很陽光"};//創(chuàng)建數(shù)組vars=fromninstrwheren.Length>3selectn;foreach(varnin LINQLINQ查詢語句增加了條件查詢。該條件的意義為查詢字符串長度大于3的字符串,運行后如圖20-1所示。20-1LINQ查詢語從圖20-1可以看出,能夠使用類似于SQL語句的形式進行數(shù)據(jù)集的查詢,很大程度上方便了開發(fā)人員對于數(shù)據(jù)庫中數(shù)據(jù)的和整理。LINQ可以使用條件語句進行篩選,有關(guān)LINQ的語句,會在后面的章節(jié)中詳細地講解。LINQ構(gòu)在.NET3.5中,LINQ(LanguageIntegratedQuery)已經(jīng)成為了編程語言的一部分,開VisualStudio2008LINQ的應(yīng)用程序。LINQ對基于.NET平臺的編程語言提供了標準的查詢操作。在.NET3.5中,LINQ20-2所示。20-2LINQ基本構(gòu)20-2所示,LINQ能夠?qū)Σ煌膶ο筮M行查詢。在.NET3.5中,微軟提供了不同LINQLINQ層,該層提供了LINQ查詢操作并能夠提供數(shù)據(jù)和整合功能。LINQ55LINQtoObjects、LINQtoDataSet、LINQtotoXML,本書也詳細介紹LINQ的這兩個部分。LINQtoSQL提供了對SQLServer中數(shù)據(jù)庫的和整合功能,同時能夠以對象的形LINQ提供了通過對象的形式對數(shù)據(jù)庫進行描述。LINQtoXML提供了對XML中數(shù)據(jù)集的和整合功能。LINQtoXML使用System.Xml.Linq命名控件,為XML操作提供了高效易用的方法。LINQVisualStudio2008新特LINQVisualStudio2008的新特性,LINQVisualStudio中的一部分。VisualStudio2008LINQ提供很好的編程環(huán)境,LINQC#VisualStudio2008VisualStudio2008與VisualStudio2005不同的是,VisualStudio2008支持多個版本.NETVisualStudio2008中可以選擇基于.NET2.0或.NET3.X版本的框架來開發(fā)不同的應(yīng)用程序。當選擇不同的應(yīng)用程序基礎(chǔ)框架時,VisualStudio2008能夠智能地提供不同名空間。VisualStudio2008AJAXASP.NET2.0ASP.NETAJAX1.0創(chuàng)建ASP.NET3.5應(yīng)用程序已經(jīng)能夠非常方便地使用AJAX功能。VisualStudio2008VisualStudio2008中,微軟提供了可視化操作,開發(fā)人員可以選擇視圖、拆分和代碼3種視圖進行不同的開發(fā)體驗。VisualStudio2008LINQVisualStudio2008中比較值得期待的功能。LINQVisualStudio2008VisualStudio2008對LINQ的原生支持。使用LINQ能夠快速地進行數(shù)據(jù)庫的和整合,這樣在一定的意義上降低了開發(fā)難度。LINQ在.NETFramework3.5中的位置如圖20-3所示。20-3NET框架20-3所示,.NET2.0后面幾個版本的框架都是基于.NETFramework2.0而存在的。在.NETFramework3.0WPF,WCF,WF等新特性以提供快速的面向服務(wù)的開發(fā)和完善的用戶體驗解決方案。而LINQ是作為.NETFramework3.5存在于.NETFramework中的,這也就是說只有在.NETFramework3.5LINQ技術(shù)。由于.NETFramework3.5版本的框架基于.NETFramework3.0版本,開發(fā)人員可以LINQ特性進行分布式開發(fā)和面向服務(wù)的開發(fā),這樣就能夠更近一步地提高代碼的復LINQWebLINQ能夠方便地使用面向?qū)ο蟮姆椒ㄟM行創(chuàng)建使用LINQWeb應(yīng)用程LINQWebWeb應(yīng)用程序時選擇的平臺是基于.NETFramework3.5LINQWeb應(yīng)用程序,如圖20-4所示。20-4選擇.NETFramework當創(chuàng)建一個基于系統(tǒng).NETFramework3.5的應(yīng)用程序,系統(tǒng)就能夠自動為應(yīng)用程序創(chuàng)建LINQ所需要名空間。示例代碼如下所示。usingusingSystem.Xml.Linq;usingSystem.Linq;程序中能夠使用LINQ查詢語句進行查詢,示例代碼如下所示。protectedprotectedvoidPage_Load(objectsender,EventArgs應(yīng)用varsfromninstrwheren.Contains("Cselectn;LINQ查foreach(vartins)Response.Write(t.ToString()+"<br/>");20-5ASP.NET執(zhí)行LINQ合成為編程語言中的一部分。基于.NETFramework3.5LINQ特性基本的LINQ數(shù)據(jù)查使用LINQ能夠?qū)?shù)據(jù)集進行查詢。在ASP.NET中,可以創(chuàng)建一個新的LINQ數(shù)據(jù)庫20-6LINQtoSQLLINQtoSQL類,能夠映射一個數(shù)據(jù)庫,實現(xiàn)數(shù)據(jù)對象的創(chuàng)建,如圖20-7SQL類文件中,如圖20-8所示。且能夠在LINQtoSQL類文件中可以設(shè)置多個表,進行可視化關(guān)聯(lián)操作。圖20-7服務(wù)器資源管理 圖20-8拖動一個LINQtoSQL類文件后,LINQtoSQL類就將數(shù)據(jù)進行對象化,這里的對象LINQtoSQL創(chuàng)建的類進行數(shù)據(jù)庫查詢和整合操作,示例代碼如下所示。protectedprotectedvoidPage_Load(objectsender,EventArgsontextdata=newvars=fromnindata.mynewswheren.ID==1selectforeach(vartinMyData.dbmlLINQtoSQL文件,開發(fā)人員能夠直接使用該類的對LINQtoSQL文件提供的類進行數(shù)據(jù)查詢,LINQ查詢varvarsfromnindata.mynewswheren.ID==1select 上述代碼使用LINQ查詢語句查詢了mynewsID1的行。使LINQtotoSQLMyDataDontextLINQtoSQL操作方法,示ontextontextdata=new //使用LINQ 20-9LINQ執(zhí)行數(shù)據(jù)庫查使用LINQ技術(shù)能夠方便地進行數(shù)據(jù)庫查詢和整合操作。LINQ不僅能夠?qū)崿F(xiàn)類似SQLLINQtoSQL類文件中,可以進行數(shù)據(jù)表的可視化LINQtoSQLLINQtoSQL類文件提供的數(shù)據(jù)集的封裝進行數(shù)使用LINQtoSQL類文件能夠極快地創(chuàng)建一個LINQ到SQL數(shù)據(jù)庫的映射并進行數(shù)據(jù)IEnumerable和IEnumerable<T>接IEnumerableIEnumerable<T>接口在.NET中是非常重要的接口。它允許開發(fā)人員定義foreach語句功能的實現(xiàn)并支持非泛型方法的簡單的迭代,IEnumerable和IEnumerable<T>接口是.NETFramework中最基本的集合器,這兩個接口對于LINQ的 usingusingusingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;publicstringpublicstring (stringname,stringNameName=name;Age=age;上述代碼定義了一個類并抽象一個類的屬性,這些屬性包括Name和Age。Name和Age屬性分別用于描述的名字和,用于數(shù)據(jù)初始化。初始化之后的數(shù)據(jù)就需要創(chuàng)建一系列對象。通過這些對象的相應(yīng)屬性能夠進行對象的和classclassstaticvoidMain(string[][]per=foreach pin ine("Nameis"+p.Name+"andAgeis"+p.Age);2個foreach語法進行對象的遍歷。但Per變量,而如果需要直接對對象的集合進行查詢,卻不能夠?qū)崿F(xiàn)[] []per=for(inti=0;i<array.Length;per[i]=Peopleforeach語句 ine("Nameis"+p.Name+"andAgeis"+pforeachlist=在上述代碼的foreach語句中,直接在類的集合中進行查詢,系統(tǒng)則會報錯: ”不包含“GetEnumerator”的公共定義。因此foreach語句不 ”類型的變量,因為類并不支持foreach語句進行遍歷,為了讓相應(yīng)的類能夠支持 publicpublicIEnumeratorreturnnew為了讓自定義類型能夠支持foreach語句,則必須對 publicstringName;publicstringAge;(stringname,stringName=name;Age=age;publicIEnumeratorreturn Enum:[]intposition=- []_per=list;publicboolMoveNext()return(position<_per.Length);publicvoidReset()position=-1;publicobjectCurrentreturncatch}}}foreach語句的功能。當開發(fā)類初始化后,就可以直接使用al類對象的集合進行LINQ查詢。示例代staticstaticvoidMain(string[][]per=list= foreach p ine("Nameis"+p.Name+"andAgeis"+p.Age);從上述代碼中可以看出,初始化對象時初始化的是一個對象的集合,在該對象LINQ直接進行對象的操作。這樣做既封裝了對象,也能夠讓編碼更加易讀。在.NETFramework3.5中,LINQ支持數(shù)組的查詢,開發(fā)人員不必自己手動創(chuàng)IEnumerable和IEnumerable<T>接口以支持某個類型的foreach編程方法,但是IEnumerable和IEnumerable<T>是LINQ中非常重要的接口。在LINQ中也大量的使用IEnumerable和IEnumerable<T>進行封裝,示例代碼如下所示。publicpublicstaticIEnumerable<TSource>foreach(TSourceelementinsource)if(predicate(element))yieldreturn上述代碼為LINQ內(nèi)部的封裝。從代碼中可以看到,在LINQ內(nèi)部也大量地使用了IEnumerable和IEnumerable<T>接口實現(xiàn)LINQ查詢。IEnumerable原本就是.NETFramework中最基本的集合器,而LINQ是面向關(guān)系(有序N元組集合)的,自然也就是面向IEnumerable<T>IEnumerableIEnumerable<T>LINQ的理解是有一定幫IQueryProvider和IQueryable<T>接IQueryable和IQueryable<T>同樣是LINQ中非常重要的接口。在LINQ查詢語句中,過重寫IQueryable和IQueryable<T>接口以實現(xiàn)用不同的方法進行不同的LINQ查詢語句的要的屬性,這兩個屬性分別為Expression和Provider。Expression和Provider分別表示獲取與IQueryable的實例關(guān)聯(lián)的表達式 開發(fā)人員能夠自定義LINQProvider。IQueryable和IQueryable<T>接口中,還需要另外一個接口,這個接口就是IqueryProviderLINQ查詢語句的解釋工作,這個接口也是整個算法的。IQueryable<T>接口在MSDN中的定義如下所示。publicpublicinterfaceIQueryable<T>:IEnumerable<T>,IQueryable,{}publicinterfaceIQueryable:{TypeElementTypeget ExpressionExpressionget IQueryProviderProviderget }上述代碼定義了IQueryable<T接口的規(guī)范,用于保持數(shù)據(jù)源和查詢狀態(tài)。publicpublicinterfaceobjectExecute(Expression等。為了能夠創(chuàng)建自定義LINQProvider,可以編寫接口的實現(xiàn)。示例代碼如下所示。publicpublic{ement>query.expression return //返回query對}IQueryable對象,在接口中可以看到IQueryable對象,另一個則是執(zhí)行表達式對象的集合。publicpublicIQueryableCreateQuery(Expression{return }{varexp=expressionasMethodCallExpression; vardata=((exp.Arguments[0]asConstantExpression).Valueasvarfunc=(exp.Arguments[1]asUnaryExpression).Operandasvarlambda=Expression.Lambda<Func<T,bool>>(func.Body,varr=data.Where( return(TResult)r.GetEnumerator();}來實現(xiàn)的。IQueryProviderIQueryable<T>LINQ應(yīng)用IQueryProviderIQueryable<T>LINQProvider,因為LINQIQueryProviderIQueryable<T>接口有助于了解LINQ內(nèi)部是如何執(zhí)行的。LINQ相關(guān)名空LINQIEnumerable<T>技術(shù)的統(tǒng)稱。對于不同的數(shù)據(jù)庫和對象都有自己的LINQ名稱,例如LINQtoSQL、System.Data.Linq:該命名空間包含支持與LINQtoSQL應(yīng)用程序中的關(guān)系數(shù)據(jù)容的LINQtoSQL對象模型的類。Syse.Liq:該命名空間提供支持使用語言集成查詢(LINQ)進行查詢的類和接口。System.Xml.LinqLINQtoXML的類,LINQtoXMLXML編LINQ中常用名空間為開發(fā)人員提供LINQ到數(shù)據(jù)庫和對象的簡單的解決方案,的對象的查詢方法,如數(shù)據(jù)集和數(shù)據(jù)庫都可以使用類似的LINQ語句進行查詢操作。LambdaLambda表達式是一種高效的類似于函數(shù)式編程的表達式,Lambda簡化了開發(fā)中需要Lambda表達式能夠快速上手LINQ應(yīng)用開發(fā)。方法在了解Lambda表達式之前,需要了解什么是方法。方法簡單地說,就是沒publicpublicintsum(inta,intreturna+方法名稱(sum)和參數(shù)列表。而方法可以看作是一個委托的擴展,是一個沒有命名delegatedelegateintSum(inta,intprotectedvoidPage_Load(objectsender,EventArgse)Sums=delegate(inta,intb)returna+方法對象時,可以通過參數(shù)格式創(chuàng)建一個方法。方法能夠通過傳遞的參數(shù)進行一上述代碼使用了s(5,6)方法進行兩個數(shù)的加減。方法雖然沒有名稱,但是同樣可注意:雖然方法沒有名稱,但是編譯器在編譯過程中,還是會為該方法定義一個名 delegateintSum(inta,intb);publicdelegateintSum(inta,intb);publicintretSum(inta,intb)returna+protectedprotectedvoidPage_Load(objectsender,EventArgs{Sums=intresult=s(10,//使}從上述代碼中可以看出,方法是一個沒有名稱的方法,但是方法可以將方法名作為參數(shù)進行傳遞。上述代碼中變量s就是一個方法,這個方法的方法體被聲明為retSum。編譯器進行編譯時,方使用retSum執(zhí)行其方法體并進行運算。匿名方法最明顯的好處就是可以降低常規(guī)方法編寫時的工作量,另外一個好處就是可以Lambda表達式基在了解了方法后,就能夠開始了解Lambda表達式。ambda表達式在一定程度上就是方法的另一種表現(xiàn)形式。為了方便對Lambda表達式的解釋,首先需要創(chuàng)建一個People類,示例代碼如下所示。publicpublicclasspublicintage{get;set;}publicstringname{get;set;}publicPeople(intage,stringname)this.age=age;=name;上述代碼定義了一個People類,并包含一個默認的構(gòu)造函數(shù)能夠為People對象進行List進行泛型編程,List<People>List<People>people=newList<People>();Peoplep1=newPeople(21,"guojing");Peoplep2=newPeople(21,"wujunmin");Peoplep3=newPeople(20,"muqing");Peoplep4=newPeople(23,"lupan");上述代碼創(chuàng)建了4個對象,這4個對象分別初始化了和名字,并添加到List列表IEnumerable<PeopleIEnumerable<Peopleresultspeople.Where(delegate(Peoplepreturnp.age>20;});// 上述代碼通過IEnumerable接口創(chuàng)建了result集合,并且該集合中填充的是大于20的People對象。細心的讀者就能夠發(fā)現(xiàn)在這里使用了一個方法進行篩選,因為該方法沒有名稱,該方法通過使用People類對象的age字段進行篩選。IEnumerable<People>IEnumerable<People>results=people.Where(People=>People.age>上述代碼同樣返回了一個People對象的集合給變量results,但是其編寫的方法更加容易閱讀。從這可以看出,Lambda表達式在編寫的格式上和方法非常相似。其實當編譯器開始編譯并運行,Lambda表達式最終也表現(xiàn)為方法。使用方法實際上并不是創(chuàng)建了沒有名稱的方法,實際上編譯器會創(chuàng)建一個方法。這個方法對于開發(fā)人員來說是看不見的,該方將People類的對象中符合p.age>20條件的Lambda表達式,當編譯器編譯時,Lambda表達式同樣會被編譯成一個方法進行相應(yīng)的操作。但是相比于方法而言。Lambda表達式更容易閱讀。Lambda表達式的格式如下所示。PeoplePeople.age>20。使用Lambda表達式能夠讓人很容易地理解該語句究竟是如何執(zhí)行的,雖然方法提供了同PeoplePeople.age20卻能夠很好的理解為“返20Lambda表達式并沒有什么高深的技術(shù),Lambda表達式可以看作是方法的另一種表現(xiàn)形式。其實Lambda表達式經(jīng)過反編譯后,與方法Lambda表達式格名方法中,“(”,“)Lambda表達式中“(參數(shù)列表)”。而方法中“{”,“}”內(nèi)是方法的語句塊,這也對應(yīng)了Lambda表達式“=>”符號右邊的表達式和語句塊項。由于Lambda表達式是一種方法,所以Lambda表Lambda表達式可以有一個或多個參數(shù),甚至可以沒有參數(shù)。其參數(shù)類型可以隱式或(x,y)=>x*yx=>x*5x=>{returnx*5;(intx)=>x*(intx)=>{returnx*5;}()=>Console.Wri

LambdaLambda表達式時,可以忽略參數(shù)(x(xyx Lambda表達式中的表達式和表達式體都能夠被轉(zhuǎn)換成表達式樹,這在表達式樹的構(gòu)造上會起到很好的作用。表達式樹也是LINQ中最基本最重要的概念。LambdaLambdaLINQ中最重要的一個概念。Lambda表達式樹允許開發(fā)人員像LambdaLambda表達式樹之前還需要使用Sys

溫馨提示

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

評論

0/150

提交評論