詳解LINQ入門(mén)(上篇)
前 言
最近和我們老大一起做技術(shù)面試(我是旁聽(tīng)的),發(fā)現(xiàn)前來(lái)面試的沒(méi)幾個(gè)掌握甚至是丁點(diǎn)了解LINQ。這讓我很納悶,LINQ伴隨2008一起發(fā)布至今難道大家真的沒(méi)時(shí)間去了解一下或者學(xué)習(xí)一下這個(gè)應(yīng)用基礎(chǔ)嗎。甚至問(wèn)及有些人LINQ是什么,答題者想都不想 LINQ TO SQL, 崩潰!沒(méi)錯(cuò),LINQ是可以TO SQL,但是除了SQL,LINQ就無(wú)所作為了?非也。因此在這里和大家一起分享學(xué)習(xí)LINQ。本文適合以下讀者, 如果你是不符合者請(qǐng)賞臉捧個(gè)場(chǎng),3Q
- 從未觸碰過(guò)LINQ的
- 對(duì)LINQ有過(guò)了解但是從未實(shí)戰(zhàn)過(guò)的
- 打算學(xué)習(xí)LINQ的
簡(jiǎn) 介
LINQ 是什么?引用官方術(shù)語(yǔ)“語(yǔ)言集成查詢 (LINQ) 是 Visual Studio 2008 和 .NET work 3.5 版中引入的一項(xiàng)創(chuàng)新功能,它在對(duì)象領(lǐng)域和數(shù)據(jù)領(lǐng)域之間架起了一座橋梁?!?那么LINQ給我們帶來(lái)了什么,請(qǐng)看以下例子:
問(wèn):有序列A=int[]{1,2,3,4,5,6,7,8,0}; B=int[]{2,4,7,8,9}。請(qǐng)求出包含A和B共同值的序列C。
如果按照原來(lái)的思路,那么編碼也許如下:
說(shuō)明:
List<int> c = new List<int>();
foreach(int a in A){
foreach(int b in b) {
if (a==b) {
c.add(a);
}
}
}
說(shuō)明:
是不是覺(jué)得上面這段雖然沒(méi)什么問(wèn)題,但是很丑陋。如果我們引用LINQ來(lái)編寫(xiě)呢:
IEnumerable<int> C = from a in A
from b in B
where a==b
select a;
語(yǔ) 法
1. LINQ所處在的主要命名空間:System.Linq
2. LINQ的處理的核心對(duì)象就是IEnumerable可枚舉對(duì)象也包括了泛型枚舉,換句話說(shuō)當(dāng)你要處理的對(duì)象為IEnumerable類型對(duì)象時(shí)即可使用LINQ操作它。且在沒(méi)有經(jīng)過(guò)其他處理的情況下將返回一個(gè)新的IEnumerable序列,注意LINQ有一個(gè)特性“延遲加載”這個(gè)將在后續(xù)說(shuō)明。
3. 關(guān)鍵字(摘自MSDN):
from : 指定數(shù)據(jù)源和范圍變量(類似于迭代變量)。
where: 根據(jù)一個(gè)或多個(gè)由邏輯“與”和邏輯“或”運(yùn)算符(&& 或 ||)分隔的布爾表達(dá)式篩選源元素。
select: 指定當(dāng)執(zhí)行查詢時(shí)返回的序列中的元素將具有的類型和形式。
group: 按照指定的鍵值對(duì)查詢結(jié)果進(jìn)行分組。
into: 提供一個(gè)標(biāo)識(shí)符,它可以充當(dāng)對(duì) join、group 或 select 子句的結(jié)果的引用。
orderby: 基于元素類型的默認(rèn)比較器按升序或降序?qū)Σ樵兘Y(jié)果進(jìn)行排序。
join: 基于兩個(gè)指定匹配條件之間的相等比較來(lái)聯(lián)接兩個(gè)數(shù)據(jù)源。
let: 引入一個(gè)用于存儲(chǔ)查詢表達(dá)式中的子表達(dá)式結(jié)果的范圍變量。
in: join 子句中的上下文關(guān)鍵字。
on: join 子句中的上下文關(guān)鍵字。
equals: join 子句中的上下文關(guān)鍵字。
by: group 子句中的上下文關(guān)鍵字。
ascending:orderby 子句中的上下文關(guān)鍵字。
descending:orderby 子句中的上下文關(guān)鍵字。
4. 語(yǔ)法說(shuō)明,每個(gè)LINQ語(yǔ)句都以from作為開(kāi)頭,以select作為結(jié)束,這點(diǎn)和T-SQL語(yǔ)法不通的切記先入為主的思考。其他關(guān)鍵字如where則類似T-SQL作為篩選判斷條件。
樣例:IEnumerable<T> nums = from n in nums where .... orderby... select....
擴(kuò) 展
從 .net 3.0 開(kāi)始 MS 就給我們引進(jìn)了其他一些新的特性,由于篇幅關(guān)系在這里給大家簡(jiǎn)單的介紹幾個(gè)LINQ常用到的特性:
1. 關(guān)鍵字 var :
指示編譯器根據(jù)初始化語(yǔ)句右側(cè)的表達(dá)式推斷變量的類型。 推斷類型可以是內(nèi)置類型、匿名類型、用戶定義類型或 .NET Framework 類庫(kù)中定義的類型。這樣我們就可以在上述的LINQ表達(dá)式中 例如可簡(jiǎn)寫(xiě)為: var nums = from n in nums where .... orderby... select....
2. 匿名類型:
匿名類型提供了一種方便的方法,可用來(lái)將一組只讀屬性封裝到單個(gè)對(duì)象中,而無(wú)需首先顯式定義一個(gè)類型。 類型名由編譯器生成,并且不能在源代碼級(jí)使用。 每個(gè)屬性的類型由編譯器推斷。例如:var obj = new {A="a", B="b"}; 而LINQ則可以為 var nums = from obj in objs select new {obj.A, obj.B}
案 例
普通查詢
var query = from num in num
select num.ProperyA
篩選查詢
var query = from obj in objs
where obj.ProperyA > Condition
select obj
分組查詢
var query = from obj in objs
group obj by obj.PropertyA into g
orderby g.Key
select g;
注意,在此示例里,關(guān)鍵字 into 不是必須的,使用 into 時(shí),必須繼續(xù)編寫(xiě)該查詢,并最終用一個(gè) select 語(yǔ)句或另一個(gè) group 子句結(jié)束該查詢。
內(nèi)聯(lián)查詢
var query= from obj1 in objs1
join obj2 in objs2 on obj1.ID equals obj2.ID
select new { A= obj1.Property, B = obj2.Property };
左外聯(lián)查詢
var query = from obj1 in objs1
join obj2 in objs2 on obj1.ID equals obj2.Obj1ID into g
from subpet in g.DefaultIfEmpty()
select new { P1 = obj1.P1, P2 = (subpet == null ? null : subpet.P2 ) };
注意,此處涉及到.net 3.5 新特性靜態(tài)擴(kuò)展方法(后續(xù)介紹不影響理解)DefaultIfEmpty():如果序列為空,則返回一個(gè)具有默認(rèn)值的單一實(shí)例集合
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C# ODP.NET 調(diào)用Oracle函數(shù)返回值時(shí)報(bào)錯(cuò)的一個(gè)解決方案
欄 目:C#教程
下一篇:Unity shader實(shí)現(xiàn)百葉窗特效
本文標(biāo)題:詳解LINQ入門(mén)(上篇)
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/4590.html
您可能感興趣的文章
- 01-10C#中Socket通信用法實(shí)例詳解
- 01-10C#裝箱和拆箱原理詳解
- 01-10C#類的多態(tài)性詳解
- 01-10C#創(chuàng)建不規(guī)則窗體的4種方式詳解
- 01-10C#中深度復(fù)制和淺度復(fù)制詳解
- 01-10輕松學(xué)習(xí)C#的基礎(chǔ)入門(mén)
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之隊(duì)列(Quene)實(shí)例詳解
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之順序表(SeqList)實(shí)例詳解
- 01-10C#編程實(shí)現(xiàn)連接ACCESS數(shù)據(jù)庫(kù)實(shí)例詳解
- 01-10C#數(shù)據(jù)結(jié)構(gòu)之單鏈表(LinkList)實(shí)例詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子


