天天看點

C# Linq簡介

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 =&gt; p.Value)</code>

<code>             </code><code>};</code>

<code>result.ToList().ForEach((i) =&gt;</code>

<code>    </code><code>Console.WriteLine(i.Key + </code><code>":"</code> <code>+ i.SumValue);</code>

<code>});</code>

可以得到分組統計的結果。

二、Linq to SQL

這是Linq技術的重頭戲,當然現在有了EntityFramework等技術,但是我們還是可以關注一下。

我們建立兩張表,很簡單。

C# Linq簡介

然後在項目中建立一個Linq to SQL類,切換到設計界面。同時打開服務資料總管,添加資料連接配接,連接配接到資料庫。拖動classInfo和studentInfo兩張表到Linq to SQL類檔案的設計界面,我們會發現關系替我們都準備的好好的。

C# Linq簡介

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 =&gt; 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&lt;studentInfo&gt; 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>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code>

<code>&lt;</code><code>Students</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>Student</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>Name</code><code>&gt;Xiao Ming&lt;/</code><code>Name</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>Phone</code> <code>Type</code><code>=</code><code>"Home"</code><code>&gt;99599&lt;/</code><code>Phone</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>phone</code> <code>Type</code><code>=</code><code>"Work"</code><code>&gt;010-99599&lt;/</code><code>phone</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>Address</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>Street</code><code>&gt;123 Street&lt;/</code><code>Street</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>City</code><code>&gt;123 City&lt;/</code><code>City</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>State</code><code>&gt;1&lt;/</code><code>State</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>Postal</code><code>&gt;0000000&lt;/</code><code>Postal</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>Address</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>Student</code><code>&gt;</code>

<code>&lt;/</code><code>Students</code><code>&gt;</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&lt;</code><code>string</code><code>&gt;(</code><code>"NameNumber"</code><code>) == q.Field&lt;</code><code>string</code><code>&gt;(</code><code>"NameNumber"</code><code>)</code>

<code>                 </code><code>NameNumber = p.Field&lt;</code><code>string</code><code>&gt;(</code><code>"NameNumber"</code><code>),</code>

<code>                 </code><code>Type = p.Field&lt;</code><code>string</code><code>&gt;(</code><code>"Type"</code><code>),</code>

<code>                 </code><code>Address = q.Field&lt;</code><code>string</code><code>&gt;(</code><code>"Address"</code><code>)</code>

<code>result.ToList().ForEach(x =&gt; Console.WriteLine(x.NameNumber + </code><code>"-"</code> <code>+ x.Type + </code><code>"-"</code> <code>+ x.Address));</code>

效果圖下:

C# Linq簡介

本文轉自 guwei4037  51CTO部落格,原文連結:http://blog.51cto.com/csharper/1344191