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