LInq是Language Integrated Query的簡稱,它是微軟在.net framework 3.5裡面新加入的特性,用以簡化查詢查詢操作。它主要包含了3塊,Linq to Object、Linq to SQL、Linq to XML,其中Linq to Object和對于對象的查詢,Linq to XML則又提供了對XML格式資料的檢索、設定等功能,其中值得關注的Linq to SQL是我們要重點掌握的,因為它改變了我們傳統的對于SQL操作的認識。
一、Linq to Object
先上一段代碼:
1
2
3
4
5
6
7
<code>string</code><code>[] contries = </code><code>new</code> <code>string</code><code>[] { </code><code>"china"</code><code>, </code><code>"russia"</code><code>, </code><code>"american"</code><code>, </code><code>"spain"</code><code>, </code><code>"japan"</code><code>, </code><code>"china"</code> <code>};</code>
<code>var</code> <code>query = </code><code>from</code> <code>c </code><code>in</code> <code>contries </code><code>select</code> <code>c;</code><code>//Linq to object</code>
<code>IEnumerator enumerator = query.GetEnumerator();</code>
<code>while</code> <code>(enumerator.MoveNext())</code>
<code>{</code>
<code> </code><code>Console.WriteLine(enumerator.Current);</code>
<code>}</code>
注意Linq to Object的文法,from c in contries select c ; // 這裡的c任意起名,in後面的contries 為數組對象或者是清單、集合等對象,select c 與前面的c保持一緻。這是Linq強大的地方,試想我們以前要想查詢數組裡面的每一個元素要寫一層for循環然後循環輸出。這裡似乎看不出什麼明顯優勢的地方,我們繼續往下看。
<code>var</code> <code>query = </code><code>from</code> <code>c </code><code>in</code> <code>contries </code><code>select</code> <code>c;</code>
<code>替換為:</code>
<code>var</code> <code>query = </code><code>from</code> <code>c </code><code>in</code> <code>contries.Distinct() </code><code>where</code> <code>c.Length == 5 </code><code>orderby</code> <code>c </code><code>ascending</code> <code>select</code> <code>c;</code>
我們會發現利用linq可以很容易的像利用sql語句一樣查詢、排序,如果利用原始的技術可能要多些好幾行代碼!
再舉個例子。
我在裡面給出了解答,當然了裡面的List完全可以是從資料庫中擷取,我簡單模拟了一下,代碼如下。
定義1個實體類:
8
9
10
11
<code>public</code> <code>class</code> <code>Product</code>
<code> </code><code>public</code> <code>Product(</code><code>string</code> <code>province, Int32 value)</code>
<code> </code><code>{</code>
<code> </code><code>this</code><code>.Province = province;</code>
<code> </code><code>this</code><code>.Value = value;</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>public</code> <code>string</code> <code>Province { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>public</code> <code>Int32 Value { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
然後在Main函數中輸入:
<code>var</code> <code>result = </code><code>from</code> <code>p </code><code>in</code> <code>list.AsEnumerable()</code>
<code> </code><code>group</code> <code>p </code><code>by</code> <code>p.Province </code><code>into</code> <code>g</code>
<code> </code><code>select</code> <code>new</code>
<code> </code><code>{</code>
<code> </code><code>g.Key,</code>
<code> </code><code>SumValue = g.Sum(p => p.Value)</code>
<code> </code><code>};</code>
<code>result.ToList().ForEach((i) =></code>
<code> </code><code>Console.WriteLine(i.Key + </code><code>":"</code> <code>+ i.SumValue);</code>
<code>});</code>
可以得到分組統計的結果。
二、Linq to SQL
這是Linq技術的重頭戲,當然現在有了EntityFramework等技術,但是我們還是可以關注一下。
我們建立兩張表,很簡單。

然後在項目中建立一個Linq to SQL類,切換到設計界面。同時打開服務資料總管,添加資料連接配接,連接配接到資料庫。拖動classInfo和studentInfo兩張表到Linq to SQL類檔案的設計界面,我們會發現關系替我們都準備的好好的。
OK,這時就可以寫相應代碼,進行添加操作了。
12
13
14
15
16
17
18
<code>DataClasses1DataContext datacontext = </code><code>new</code> <code>DataClasses1DataContext();</code>
<code>classInfo classInfo = </code><code>new</code> <code>classInfo()</code>
<code> </code><code>classId = 1,</code>
<code> </code><code>className = </code><code>"grade1"</code>
<code>};</code>
<code>datacontext.classInfo.InsertOnSubmit(classInfo);</code>
<code> </code>
<code>studentInfo studentInfo = </code><code>new</code> <code>studentInfo()</code>
<code> </code><code>studentId = </code><code>"001"</code><code>,</code>
<code> </code><code>studentName = </code><code>"liming"</code><code>,</code>
<code> </code><code>classId = 1</code>
<code>datacontext.studentInfo.InsertOnSubmit(studentInfo);</code>
<code>datacontext.SubmitChanges();</code>
這樣就添加了1條班級記錄和1條學生記錄。
如果我們要删除一條學生記錄怎麼辦?舉個例子,鍵入如下代碼:
<code>studentInfo studentInfo = datacontext.studentInfo.Single(c => c.studentName == </code><code>"liming"</code><code>);</code>
<code>datacontext.studentInfo.DeleteOnSubmit(studentInfo);</code>
這樣就把liming這個學生記錄給删除了,很簡單吧?
好,現在我們修改這個學生記錄,把名字改成zhang3。
<code>studentInfo.studentName = </code><code>"zhang3"</code><code>;</code><code>//直接賦新的值</code>
<code>datacontext.SubmitChanges();</code><code>//送出更改就可以了</code>
補充一點很重要的,就是如何用linq to sql來進行查詢操作。
前面的Single其實就是一種查詢操作,傳回單個對象。
直接上一個linq帶條件的分頁查詢執行個體:
<code> </code>
<code>var</code> <code>singleStudent = </code><code>from</code> <code>s </code><code>in</code> <code>datacontext.studentInfo</code>
<code> </code><code>where</code> <code>s.studentName != </code><code>"zhang3"</code>
<code> </code><code>orderby</code> <code>s.classInfo </code><code>descending</code>
<code> </code><code>select</code> <code>s;</code>
<code>IList<studentInfo> studentList = singleStudent.Skip(pageSize * (pageNumber - 1)).Take(pageSize).ToList();</code>
<code>foreach</code> <code>(studentInfo student </code><code>in</code> <code>studentList)</code>
<code> </code><code>Console.WriteLine(</code><code>"studentId:"</code> <code>+ student.studentId + </code><code>"studentName:"</code> <code>+ student.studentName);</code>
三、Linq to XML
1、建立XML
<code>XElement contacts =</code>
<code> </code><code>new</code> <code>XElement(</code><code>"Students"</code><code>,</code>
<code> </code><code>new</code> <code>XElement(</code><code>"Student"</code><code>,</code>
<code> </code><code>new</code> <code>XElement(</code><code>"Name"</code><code>, </code><code>"Xiao Ming"</code><code>),</code>
<code> </code><code>new</code> <code>XElement(</code><code>"Phone"</code><code>, </code><code>"99599"</code><code>,</code>
<code> </code><code>new</code> <code>XAttribute(</code><code>"Type"</code><code>, </code><code>"Home"</code><code>)),</code>
<code> </code><code>new</code> <code>XElement(</code><code>"phone"</code><code>, </code><code>"010-99599"</code><code>,</code>
<code> </code><code>new</code> <code>XAttribute(</code><code>"Type"</code><code>, </code><code>"Work"</code><code>)),</code>
<code> </code><code>new</code> <code>XElement(</code><code>"Address"</code><code>,</code>
<code> </code><code>new</code> <code>XElement(</code><code>"Street"</code><code>, </code><code>"123 Street"</code><code>),</code>
<code> </code><code>new</code> <code>XElement(</code><code>"City"</code><code>, </code><code>"123 City"</code><code>),</code>
<code> </code><code>new</code> <code>XElement(</code><code>"State"</code><code>, </code><code>"1"</code><code>),</code>
<code> </code><code>new</code> <code>XElement(</code><code>"Postal"</code><code>, </code><code>"0000000"</code><code>)</code>
<code> </code><code>)</code>
<code> </code><code>)</code>
<code>);</code>
<code>contacts.Save(</code><code>"test.xml"</code><code>);</code>
你會發現,你隻要記住XElement這一個核心類就可以使用Linq建立xml,而且編碼的方式很輕松,就是在表達一個xml的層級關系。
效果如下:
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?></code>
<code><</code><code>Students</code><code>></code>
<code> </code><code><</code><code>Student</code><code>></code>
<code> </code><code><</code><code>Name</code><code>>Xiao Ming</</code><code>Name</code><code>></code>
<code> </code><code><</code><code>Phone</code> <code>Type</code><code>=</code><code>"Home"</code><code>>99599</</code><code>Phone</code><code>></code>
<code> </code><code><</code><code>phone</code> <code>Type</code><code>=</code><code>"Work"</code><code>>010-99599</</code><code>phone</code><code>></code>
<code> </code><code><</code><code>Address</code><code>></code>
<code> </code><code><</code><code>Street</code><code>>123 Street</</code><code>Street</code><code>></code>
<code> </code><code><</code><code>City</code><code>>123 City</</code><code>City</code><code>></code>
<code> </code><code><</code><code>State</code><code>>1</</code><code>State</code><code>></code>
<code> </code><code><</code><code>Postal</code><code>>0000000</</code><code>Postal</code><code>></code>
<code> </code><code></</code><code>Address</code><code>></code>
<code> </code><code></</code><code>Student</code><code>></code>
<code></</code><code>Students</code><code>></code>
2、查詢XML
還是用上面生成的XML來做測試,鍵入如下代碼:
<code>XElement root = XElement.Load(</code><code>"test.xml"</code><code>);</code>
<code>IEnumerable address = </code><code>from</code> <code>el </code><code>in</code> <code>root.Elements(</code><code>"Student"</code><code>).Elements(</code><code>"phone"</code><code>)</code>
<code> </code><code>where</code> <code>el.Attribute(</code><code>"Type"</code><code>).Value == </code><code>"Work"</code>
<code> </code><code>select</code> <code>el;</code>
<code> </code>
<code>foreach</code> <code>(XElement el </code><code>in</code> <code>address)</code>
<code> </code><code>Console.WriteLine(el.Value);</code>
輸出:010-99599。
四、Linq to DataTable
意思跟Linq to Object是一樣的,應該屬于Linq to Object的範疇,這裡單獨拿出來,分享一下。
先構造兩個DataTable。
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<code>DataTable A = </code><code>new</code> <code>DataTable();</code>
<code>A.Columns.Add(</code><code>"NameNumber"</code><code>, </code><code>typeof</code><code>(</code><code>string</code><code>));</code>
<code>A.Columns.Add(</code><code>"Type"</code><code>, </code><code>typeof</code><code>(</code><code>string</code><code>));</code>
<code> </code>
<code>DataRow drA = </code><code>null</code><code>;</code>
<code>drA = A.NewRow();</code>
<code>drA[</code><code>"NameNumber"</code><code>] = </code><code>"111"</code><code>;</code>
<code>drA[</code><code>"Type"</code><code>] = </code><code>"Y"</code><code>;</code>
<code>A.Rows.Add(drA);</code>
<code>drA[</code><code>"NameNumber"</code><code>] = </code><code>"222"</code><code>;</code>
<code>drA[</code><code>"Type"</code><code>] = </code><code>"N"</code><code>;</code>
<code>DataTable B = </code><code>new</code> <code>DataTable();</code>
<code>B.Columns.Add(</code><code>"NameNumber"</code><code>, </code><code>typeof</code><code>(</code><code>string</code><code>));</code>
<code>B.Columns.Add(</code><code>"Name"</code><code>, </code><code>typeof</code><code>(</code><code>string</code><code>));</code>
<code>B.Columns.Add(</code><code>"Address"</code><code>, </code><code>typeof</code><code>(</code><code>string</code><code>));</code>
<code>DataRow drB = </code><code>null</code><code>;</code>
<code>drB = B.NewRow();</code>
<code>drB[</code><code>"NameNumber"</code><code>] = </code><code>"111"</code><code>;</code>
<code>drB[</code><code>"Name"</code><code>] = </code><code>"張三"</code><code>;</code>
<code>drB[</code><code>"Address"</code><code>] = </code><code>"上海"</code><code>;</code>
<code>B.Rows.Add(drB);</code>
<code>drB[</code><code>"NameNumber"</code><code>] = </code><code>"222"</code><code>;</code>
<code>drB[</code><code>"Name"</code><code>] = </code><code>"李四"</code><code>;</code>
<code>drB[</code><code>"Address"</code><code>] = </code><code>"北京"</code><code>;</code>
然後我們通過Linq to DataTable進行合并。
<code>var</code> <code>result = </code><code>from</code> <code>p </code><code>in</code> <code>A.AsEnumerable()</code>
<code> </code><code>from</code> <code>q </code><code>in</code> <code>B.AsEnumerable()</code>
<code> </code><code>where</code> <code>p.Field<</code><code>string</code><code>>(</code><code>"NameNumber"</code><code>) == q.Field<</code><code>string</code><code>>(</code><code>"NameNumber"</code><code>)</code>
<code> </code><code>NameNumber = p.Field<</code><code>string</code><code>>(</code><code>"NameNumber"</code><code>),</code>
<code> </code><code>Type = p.Field<</code><code>string</code><code>>(</code><code>"Type"</code><code>),</code>
<code> </code><code>Address = q.Field<</code><code>string</code><code>>(</code><code>"Address"</code><code>)</code>
<code>result.ToList().ForEach(x => Console.WriteLine(x.NameNumber + </code><code>"-"</code> <code>+ x.Type + </code><code>"-"</code> <code>+ x.Address));</code>
效果圖下:
本文轉自 guwei4037 51CTO部落格,原文連結:http://blog.51cto.com/csharper/1344191