來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=163
GPS平臺、網站建設、軟件開發、系統運維,找森大網絡科技!
http://cnsendnet.taobao.comphp
到如今爲止你還未觸碰LINQ,那進來吧 —— LINQ入門(上篇)
前 言
最近和咱們老大一塊兒作技術面試(我是旁聽的),發現前來面試的沒幾個掌握甚至是丁點了解LINQ。這讓我很納悶,LINQ伴隨2008一塊兒發佈至今難道你們真的沒時間去了解一下或者學習一下這個應用基礎嗎。甚至問及有些人LINQ是什麼,答題者想都不想 LINQ TO SQL, 崩潰!沒錯,LINQ是能夠TO SQL,可是除了SQL,LINQ就無所做爲了?非也。所以在這裏和你們一塊兒分享學習LINQ。本文適合如下讀者, 若是你是不符合者請賞臉捧個場,3Q
• 從未觸碰過LINQ的
• 對LINQ有過了解可是從未實戰過的
• 打算學習LINQ的
簡 介
LINQ 是什麼?引用官方術語「語言集成查詢 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中引入的一項創新功能,它在對象領域和數據領域之間架起了一座橋樑。」 那麼LINQ給咱們帶來了什麼,請看如下例子:
問:有序列A=int[]{1,2,3,4,5,6,7,8,0}; B=int[]{2,4,7,8,9}。請求出包含A和B共同值的序列C。
若是按照原來的思路,那麼編碼也許以下:面試
List<int> c = new List<int>(); foreach(int a in A){ foreach(int b in b) { if (a==b) { c.add(a); } } }
是否是以爲上面這段雖然沒什麼問題,可是很醜陋。若是咱們引用LINQ來編寫呢:sql
IEnumerable<int> C = from a in A from b in B where a==b select a;
是否是以爲很爽,一句話簡單的把上面醜陋的代碼給KO掉了。也許你看不懂上面的語法,不要緊請繼續往下閱讀。
語 法
1. LINQ所處在的主要命名空間:System.Linq
2. LINQ的處理的核心對象就是IEnumerable可枚舉對象也包括了泛型枚舉,換句話說當你要處理的對象爲IEnumerable類型對象時便可使用LINQ操做它。且在沒有通過其餘處理的狀況下將返回一個新的IEnumerable序列,注意LINQ有一個特性「延遲加載」這個將在後續說明。網絡
關鍵字(摘自MSDN):
from : 指定數據源和範圍變量(相似於迭代變量)。
where: 根據一個或多個由邏輯「與」和邏輯「或」運算符(&& 或 ||)分隔的布爾表達式篩選源元素。
select: 指定當執行查詢時返回的序列中的元素將具備的類型和形式。
group: 按照指定的鍵值對查詢結果進行分組。
into: 提供一個標識符,它能夠充當對 join、group 或 select 子句的結果的引用。
orderby: 基於元素類型的默認比較器按升序或降序對查詢結果進行排序。
join: 基於兩個指定匹配條件之間的相等比較來聯接兩個數據源。
let: 引入一個用於存儲查詢表達式中的子表達式結果的範圍變量。
in: join 子句中的上下文關鍵字。
on: join 子句中的上下文關鍵字。
equals: join 子句中的上下文關鍵字。
by: group 子句中的上下文關鍵字。
ascending:orderby 子句中的上下文關鍵字。
descending:orderby 子句中的上下文關鍵字。
4. 語法說明,每一個LINQ語句都以from做爲開頭,以select做爲結束,這點和T-SQL語法不通的切記先入爲主的思考。其餘關鍵字如where則相似T-SQL做爲篩選判斷條件。
樣例:IEnumerable<T> nums = from n in nums where .... orderby... select....
擴 展
從 .net 3.0 開始 MS 就給咱們引進了其餘一些新的特性,因爲篇幅關係在這裏給你們簡單的介紹幾個LINQ經常使用到的特性:
1. 關鍵字 var :
指示編譯器根據初始化語句右側的表達式推斷變量的類型。 推斷類型能夠是內置類型、匿名類型、用戶定義類型或 .NET Framework 類庫中定義的類型。這樣咱們就能夠在上述的LINQ表達式中 例如可簡寫爲: var nums = from n in nums where .... orderby... select....
2. 匿名類型:
匿名類型提供了一種方便的方法,可用來將一組只讀屬性封裝到單個對象中,而無需首先顯式定義一個類型。 類型名由編譯器生成,而且不能在源代碼級使用。 每一個屬性的類型由編譯器推斷。例如: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;
注意,在此示例裏,關鍵字 into 不是必須的,使用 into 時,必須繼續編寫該查詢,並最終用一個 select 語句或另外一個 group 子句結束該查詢。
內聯查詢
var query= from obj1 in objs1
join obj2 in objs2 on obj1.ID equals obj2.ID
select new { A= obj1.Property, B = obj2.Property };
左外聯查詢
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 新特性靜態擴展方法(後續介紹不影響理解)DefaultIfEmpty():若是序列爲空,則返回一個具備默認值的單一實例集合
總 結
本文到此,對LINQ的入門進行了簡單介紹。你能夠進行簡單的實戰應用了。後續將和你們一塊兒分享學習 什麼是靜態擴展方法,它與LINQ有什麼關係。LINQ的涉及應用如:linq to sql, lint to entites, linq to xml, linq to dataset 等等。敬請期待。
最後感謝閱讀,有說得不對的地方請多多指正。
資 源
linqpad:一個學習LINQ的好工具http://www.linqpad.net/
linq開發資源:http://www.codeproject.com/KB/linq/運維
來自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=163
GPS平臺、網站建設、軟件開發、系統運維,找森大網絡科技!
http://cnsendnet.taobao.comide