ITjob NET視頻教程之C教材linq_第1頁(yè)
ITjob NET視頻教程之C教材linq_第2頁(yè)
ITjob NET視頻教程之C教材linq_第3頁(yè)
ITjob NET視頻教程之C教材linq_第4頁(yè)
ITjob NET視頻教程之C教材linq_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第十四章LINQ本課內(nèi)容C#3.0新功能LINQ語(yǔ)法的由來(lái)LINQ語(yǔ)法的使用LINQ表達(dá)式樹(shù)1匿名類型:〔1〕值類型varnum1=1;varnums=new[]{1,2,3,4,5};varstr="";〔2〕引用類型(類似于json的功能)varabc=new{a=1,b=2};Console.WriteLine(abc.a);C#3.0新功能2集合支持初始化varlist=newList<int>(){1,2,3,4,5};foreach(varsinqueryLowNums){Console.WriteLine(s);}C#3.0新功能3擴(kuò)展類方法publicstaticclassbb{publicstaticboolOutLength(thisstringstr){if(str.Length>10)returntrue;returnfalse;}}publicclassaa{}publicstaticclassaaExtend{publicstaticvoidoutput(thisaatemp){}}//使用擴(kuò)展方法

//擴(kuò)展String預(yù)定義類Console.WriteLine(bb.OutLength("aa"));Console.WriteLine("aa".OutLength());//擴(kuò)展自定義類aanewAa=newaa();newAa.output();C#3.0新功能4自動(dòng)屬性publicclassPerson{publicstringName{get;set;}}C#3.0新功能5簡(jiǎn)化屬性賦值varperson=newPerson{Name="張三"};Console.WriteLine(person.Name);C#3.0新功能6Lambda表達(dá)式定義的委托:delegatedoubleCal(doublea,doubleb);

采用Lambda表達(dá)式調(diào)用Calaaa=(aa1,bb1)=>aa1+bb1;Console.WriteLine(aaa(2,3));C#3.0新功能以一個(gè)一級(jí)方程式世界冠軍的例子來(lái)說(shuō)明演變。見(jiàn)?LINQSamples?下的?LINQSamples?子工程定義了Racer類,賽車手的詳細(xì)內(nèi)容并通過(guò)Formula1的GetChampions方法得到所有的賽車手冠軍LINQ語(yǔ)法的由來(lái)

1、傳統(tǒng)的查詢?cè)贚ist<T>中定了FindAll和Sort方法用于實(shí)現(xiàn)集合中的查找與排序。見(jiàn)<TraditionalQuery>方法。LINQ語(yǔ)法的由來(lái)2、Enumerable系統(tǒng)預(yù)定義類中擴(kuò)展了IEnumerable<T>的Where方法,OrderByDescending方法和Select方法。見(jiàn)?ExtensionMethods?方法LINQ語(yǔ)法的由來(lái)3、采用Lambda表達(dá)式可以替換匿名方法。見(jiàn)?LambdaExpressions?方法LINQ語(yǔ)法的由來(lái)4、LinqQuery語(yǔ)法最終翻譯成集合中擴(kuò)展的Where方法,OrderByDescending方法和Select方法。見(jiàn)?LinqQuery?方法LINQ語(yǔ)法的由來(lái)1、一個(gè)簡(jiǎn)單的LinqQuery查詢范例,其中where與select關(guān)鍵字解釋成List<T>的Where和Select方法。見(jiàn)?SimpleFiltering?方法LINQ語(yǔ)法的使用2、List<T>的Where方法的參數(shù)Func<T1,T2,TResult>(T1arg1,T2arg2)的第二個(gè)參數(shù)指向集合中的元素對(duì)應(yīng)的索引??梢酝ㄟ^(guò)這個(gè)索引進(jìn)行判斷奇偶位置。見(jiàn)?SimpleFilteringWithIndex?方法LINQ語(yǔ)法的使用3、集合和函數(shù)提供了OfType方法可以按數(shù)據(jù)類型過(guò)濾數(shù)據(jù)。見(jiàn)?TypeFiltering?方法LINQ語(yǔ)法的使用4、集合中的對(duì)象有時(shí)候包含集合或數(shù)組字段,可以對(duì)這中字段用復(fù)合的from字句來(lái)解決。見(jiàn)?CompoundFrom?方法LINQ語(yǔ)法的使用5、對(duì)于多個(gè)字段的排序順序,LINQ解釋成OrderBy、ThenBy、ThenBy見(jiàn)?Ordering?方法本例子還是用Take(10);方法,用于取得前10個(gè)對(duì)象。LINQ語(yǔ)法的使用6、LINQ支持類似于數(shù)據(jù)庫(kù)的分組的語(yǔ)法,與SQL的區(qū)別在于:〔1〕分組關(guān)鍵碼進(jìn)入一個(gè)單獨(dú)的集合保存〔2〕通過(guò)這個(gè)單獨(dú)的集合對(duì)象再次進(jìn)行類似于having的再過(guò)濾功能〔3〕最后通過(guò)一個(gè)匿名類的形式呈現(xiàn)見(jiàn)?Grouping?方法LINQ語(yǔ)法的使用7、LINQ還支持分組之后的再聚合見(jiàn)?GroupingWithNestedObjects?方法LINQ語(yǔ)法的使用8、LINQ支持兩個(gè)集合的關(guān)聯(lián),類似于SQL的join語(yǔ)法,表關(guān)聯(lián)的=采用equals來(lái)代替。見(jiàn)?Join?方法LINQ語(yǔ)法的使用9、LINQ還支持集合運(yùn)算〔Union,Intersect,Except〕與唯一值過(guò)濾〔Distinct〕,分別對(duì)應(yīng)不同的方法。見(jiàn)?Intersect?方法LINQ語(yǔ)法的使用10、LINQ支持分頁(yè)功能,采用Skip和Take方法。見(jiàn)?Partitioning?方法LINQ語(yǔ)法的使用11、LINQ支持所有的聚合函數(shù),包括Sum,Count,Min,Max,Average,Aggregate。見(jiàn)?QuantifiersCount()、QuantifiersSum()、GroupingAndAggregation()?方法LINQ語(yǔ)法的使用12、LINQ支持集合子查找功能,不是通過(guò)LINQ的Where,而是通過(guò)索引器見(jiàn)?Conversion?方法LINQ語(yǔ)法的使用13、LINQ通過(guò)Range方法生成一個(gè)序列集合,通過(guò)Empty生成一個(gè)空集合〔用于參數(shù)需要傳遞一個(gè)集合的情況下〕,通過(guò)Repeat方法生成一個(gè)重復(fù)值集合見(jiàn)?Range?方法LINQ語(yǔ)法的使用14、LINQ還可以用于非泛型集合見(jiàn)?NonGenericCollection?方法LINQ語(yǔ)法的使用見(jiàn)附件的一個(gè)linqtosql的例子,我們查看categorycategorySport=dataContext.category.Single(c=>=="體育要聞");中的Single方法,發(fā)現(xiàn)了Expression<Func<TSource,bool>>這樣的對(duì)象,而我們的賦值那么是一個(gè)Lambda表達(dá)式,將一個(gè)表達(dá)式賦值給一個(gè)類是怎么解釋?為什么需要了解表達(dá)式目錄樹(shù)

看下面這幅圖:為什么需要了解表達(dá)式目錄樹(shù)

我們編寫的查詢表達(dá)式,在傳遞給Expression<Func<TSource,bool>>時(shí),首先封裝為一個(gè)表達(dá)式目錄樹(shù),然后LINQTOSQL的Provider開(kāi)始分析這個(gè)表達(dá)式目錄樹(shù),從數(shù)據(jù)庫(kù)查找相應(yīng)的數(shù)據(jù)。

表達(dá)式目錄樹(shù)〔ExpressionTree〕是一種抽象語(yǔ)法樹(shù)或者說(shuō)它是一種數(shù)據(jù)結(jié)構(gòu),通過(guò)Lambda表達(dá)式構(gòu)造一個(gè)表達(dá)式樹(shù):Expression<Func<int,int,int>>expression=(a,b)=>a*b+2;認(rèn)識(shí)表達(dá)式目錄樹(shù)

編譯器會(huì)創(chuàng)立一個(gè)表達(dá)式目錄樹(shù),如以下圖所示:認(rèn)識(shí)表達(dá)式目錄樹(shù)

每一個(gè)節(jié)點(diǎn)都表示一個(gè)表達(dá)式,可能是一個(gè)二元運(yùn)算,也可能是一個(gè)常量或者參數(shù)等。我們也可以在VisualStudio中使用ExpressionTreeVisualizer來(lái)查看該表達(dá)式目錄樹(shù)(將附件中的ExpressionTreeVisualizer.dll復(fù)制出來(lái)到...\ProgramFiles\MicrosoftVisualStudio9.0\Common7\Packages\Debugger\Visualizers.中即可在debug中使用):認(rèn)識(shí)表達(dá)式目錄樹(shù)

認(rèn)識(shí)表達(dá)式目錄樹(shù)

查看結(jié)果如以下圖所示:認(rèn)識(shí)表達(dá)式目錄樹(shù)

.NETFramework提供的表達(dá)式,如以下圖所示:認(rèn)識(shí)表達(dá)式目錄樹(shù)

它們都繼承于抽象的基類Expression,而泛型的Expression<TDelegate>那么繼承于LambdaExpression。在Expression類中提供了大量的工廠方法,這些方法負(fù)責(zé)創(chuàng)立以上各種表達(dá)式對(duì)象,如調(diào)用Add()方法將創(chuàng)立一個(gè)表示不進(jìn)行溢出檢查的算術(shù)加法運(yùn)算的BinaryExpression對(duì)象,調(diào)用Lambda方法將創(chuàng)立一個(gè)表示lambda表達(dá)式的LambdaExpression對(duì)象我們可以通過(guò)這些表達(dá)式對(duì)象手工構(gòu)造出一個(gè)表達(dá)式目錄樹(shù),代碼在備注中:認(rèn)識(shí)表達(dá)式目錄樹(shù)

構(gòu)造的表達(dá)式目錄樹(shù),仍然如以下圖所示:認(rèn)識(shí)表達(dá)式目錄樹(shù)

運(yùn)行這段代碼,輸出:認(rèn)識(shí)表達(dá)式目錄樹(shù)

通過(guò)手工構(gòu)造的方式,確實(shí)構(gòu)造出了同前面一樣的Lambda表達(dá)式。對(duì)于一個(gè)表達(dá)式目錄樹(shù)來(lái)說(shuō),它有幾個(gè)比較重要的屬性:Body:指表達(dá)式的主體局部;Parameters:指表達(dá)式的參數(shù);NodeType:指表達(dá)式的節(jié)點(diǎn)類型,如在上面的例子中,它的節(jié)點(diǎn)類型是Lambda;Type:指表達(dá)式的靜態(tài)類型,在上面的例子中,Type為Fun<int,int,int>。在ExpressionTreeVisualizer中,我們可以看到表達(dá)式目錄樹(shù)的相關(guān)屬性,如以下圖所示:認(rèn)識(shí)表達(dá)式目錄樹(shù)

認(rèn)識(shí)表達(dá)式目錄樹(shù)

Func<int,int,int>lambda=(a,b)=>a+b*2;Expression<Func<int,int,int>>expression=(a,b)=>a+b*2;其中第一句直接將Lambda表達(dá)式直接賦值給了委托,相當(dāng)于一個(gè)匿名方法。而第二句那么告訴編譯器是一個(gè)表達(dá)式目錄樹(shù),所以編譯器會(huì)分析該Lambda表達(dá)式,并生成表示該Lambda表達(dá)式的表達(dá)式目錄樹(shù),即它與我們手工創(chuàng)立表達(dá)式目錄樹(shù)是一致的。表達(dá)式目錄樹(shù)與委托

如果需要執(zhí)行表達(dá)式目錄樹(shù)。只需要調(diào)用Compile方法來(lái)創(chuàng)立一個(gè)可執(zhí)行委托即可,并且調(diào)用該委托,如備注中的代碼:執(zhí)行表達(dá)式目錄樹(shù)注意此處的Compiler方法不等同于編譯器的編譯。只能執(zhí)行表示Lambda表達(dá)式的表達(dá)式目錄樹(shù),即LambdaExpression或者Expression<TDelegate>類型。如果表達(dá)式目錄樹(shù)不是

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論