天天看点

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