无涯教程-LINQ - XML

57 阅读4分钟

LINQ to XML提供了对所有LINQ功能(如标准查询运算符,编程接口等)的轻松访问。集成在.NET框架中的LINQ to XML还充分利用了.NET框架功能,如调试,编译时检查,强类型化还有更多要说的。

LINQ XML

在使用LINQ to XML时,将XML文档加载到内存很容易,并且查询和文档修改也更加容易,也可以将内存中存在的XML文档保存到磁盘并进行序列化,它消除了开发人员学习稍微复杂的XML查询语言的需要。

LINQ to XML在System.Xml.Linq命名空间中具有强大的功能,它具有使用XML所需的全部19个必需类,这些类是以下类。

  • XAttribute
  • XCData
  • XComment
  • XContainer
  • XDeclaration
  • XDocument
  • XDocumentType
  • XElement
  • XName
  • XNamespace
  • XNode
  • XNodeDocumentOrderComparer
  • XNodeEqualityComparer
  • XObject
  • XObjectChange
  • XObjectChangeEventArgs
  • XObjectEventHandler
  • XProcessingInstruction
  • XText

读取XML文件

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML { class ExampleOfXML { static void Main(string[] args) {

     </span><span class="kwd">string</span><span class="pln"> myXML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"&lt;Departments&gt;
                   &lt;Department&gt;Account&lt;/Department&gt;
                   &lt;Department&gt;Sales&lt;/Department&gt;
                   &lt;Department&gt;Pre-Sales&lt;/Department&gt;
                   &lt;Department&gt;Marketing&lt;/Department&gt;
                   &lt;/Departments&gt;"</span><span class="pun">;</span><span class="pln">

     </span><span class="typ">XDocument</span><span class="pln"> xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">();</span><span class="pln">
     xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">myXML</span><span class="pun">);</span><span class="pln">

     </span><span class="kwd">var</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">Descendants</span><span class="pun">();</span><span class="pln">

     </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">XElement</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Department Name - "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">);</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">

     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"\nPress any key to continue."</span><span class="pun">);</span><span class="pln">
     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadKey</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

} }

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

Sub Main(ByVal args As String())

  </span><span class="typ">Dim</span><span class="pln"> myXML </span><span class="typ">As</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"&lt;Departments&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
                       </span><span class="str">"&lt;Department&gt;Account&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
                       </span><span class="str">"&lt;Department&gt;Sales&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
                       </span><span class="str">"&lt;Department&gt;Pre-Sales&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
                       </span><span class="str">"&lt;Department&gt;Marketing&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
                       </span><span class="str">"&lt;/Departments&gt;"</span><span class="pln">

  </span><span class="typ">Dim</span><span class="pln"> xdoc </span><span class="typ">As</span><span class="pln"> </span><span class="typ">New</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">()</span><span class="pln">
  xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">myXML</span><span class="pun">)</span><span class="pln">

  </span><span class="typ">Dim</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">Descendants</span><span class="pun">()</span><span class="pln">

  </span><span class="typ">For</span><span class="pln"> </span><span class="typ">Each</span><span class="pln"> item </span><span class="typ">As</span><span class="pln"> </span><span class="typ">XElement</span><span class="pln"> </span><span class="typ">In</span><span class="pln"> result
     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Department Name - "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Next</span><span class="pln">

  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">vbLf </span><span class="pun">&amp;</span><span class="pln"> </span><span class="str">"Press any key to continue."</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadKey</span><span class="pun">()</span><span class="pln">
  

End Sub

End Module

编译并执行以上C#或VB的代码时,将产生以下输出-

Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing

Press any key to continue.

添加新节点

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML { class ExampleOfXML { static void Main(string[] args) {

     </span><span class="kwd">string</span><span class="pln"> myXML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"&lt;Departments&gt;
                   &lt;Department&gt;Account&lt;/Department&gt;
                   &lt;Department&gt;Sales&lt;/Department&gt;
                   &lt;Department&gt;Pre-Sales&lt;/Department&gt;
                   &lt;Department&gt;Marketing&lt;/Department&gt;
                   &lt;/Departments&gt;"</span><span class="pun">;</span><span class="pln">

     </span><span class="typ">XDocument</span><span class="pln"> xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">();</span><span class="pln">
     xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">myXML</span><span class="pun">);</span><span class="pln">

     </span><span class="com">//Add new Element</span><span class="pln">
     xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XElement</span><span class="pun">(</span><span class="str">"Department"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Finance"</span><span class="pun">));</span><span class="pln">

     </span><span class="com">//Add new Element at First</span><span class="pln">
     xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">AddFirst</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XElement</span><span class="pun">(</span><span class="str">"Department"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Support"</span><span class="pun">));</span><span class="pln">

     </span><span class="kwd">var</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">Descendants</span><span class="pun">();</span><span class="pln">

     </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">XElement</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Department Name - "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">);</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">

     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"\nPress any key to continue."</span><span class="pun">);</span><span class="pln">
     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadKey</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

} }

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

Sub Main(ByVal args As String())

  </span><span class="typ">Dim</span><span class="pln"> myXML </span><span class="typ">As</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"&lt;Departments&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Account&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Sales&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Pre-Sales&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Marketing&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;/Departments&gt;"</span><span class="pln">

  </span><span class="typ">Dim</span><span class="pln"> xdoc </span><span class="typ">As</span><span class="pln"> </span><span class="typ">New</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">()</span><span class="pln">
  xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">myXML</span><span class="pun">)</span><span class="pln">

  xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">Add</span><span class="pun">(</span><span class="typ">New</span><span class="pln"> </span><span class="typ">XElement</span><span class="pun">(</span><span class="str">"Department"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Finance"</span><span class="pun">))</span><span class="pln">
 
  xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">AddFirst</span><span class="pun">(</span><span class="typ">New</span><span class="pln"> </span><span class="typ">XElement</span><span class="pun">(</span><span class="str">"Department"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Support"</span><span class="pun">))</span><span class="pln">

  </span><span class="typ">Dim</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">Descendants</span><span class="pun">()</span><span class="pln">

  </span><span class="typ">For</span><span class="pln"> </span><span class="typ">Each</span><span class="pln"> item </span><span class="typ">As</span><span class="pln"> </span><span class="typ">XElement</span><span class="pln"> </span><span class="typ">In</span><span class="pln"> result
     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Department Name - "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Next</span><span class="pln">

  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">vbLf </span><span class="pun">&amp;</span><span class="pln"> </span><span class="str">"Press any key to continue."</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadKey</span><span class="pun">()</span><span class="pln">
  

End Sub

End Module

编译并执行以上C#或VB的代码时,将产生以下输出-

Department Name - Support
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

删除特定节点

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML { class ExampleOfXML { static void Main(string[] args) {

     </span><span class="kwd">string</span><span class="pln"> myXML </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"&lt;Departments&gt;
                   &lt;Department&gt;Support&lt;/Department&gt;
                   &lt;Department&gt;Account&lt;/Department&gt;
                   &lt;Department&gt;Sales&lt;/Department&gt;
                   &lt;Department&gt;Pre-Sales&lt;/Department&gt;
                   &lt;Department&gt;Marketing&lt;/Department&gt;
                   &lt;Department&gt;Finance&lt;/Department&gt;
                   &lt;/Departments&gt;"</span><span class="pun">;</span><span class="pln">

     </span><span class="typ">XDocument</span><span class="pln"> xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">();</span><span class="pln">
     xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">myXML</span><span class="pun">);</span><span class="pln">

     </span><span class="com">//Remove Sales Department</span><span class="pln">
     xdoc</span><span class="pun">.</span><span class="typ">Descendants</span><span class="pun">().</span><span class="typ">Where</span><span class="pun">(</span><span class="pln">s </span><span class="pun">=&gt;</span><span class="pln">s</span><span class="pun">.</span><span class="typ">Value</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"Sales"</span><span class="pun">).</span><span class="typ">Remove</span><span class="pun">();</span><span class="pln"> 

     </span><span class="kwd">var</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">Descendants</span><span class="pun">();</span><span class="pln">

     </span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">XElement</span><span class="pln"> item </span><span class="kwd">in</span><span class="pln"> result</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Department Name - "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">);</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">

     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"\nPress any key to continue."</span><span class="pun">);</span><span class="pln">
     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadKey</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

} }

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

Sub Main(args As String())

  </span><span class="typ">Dim</span><span class="pln"> myXML </span><span class="typ">As</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"&lt;Departments&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Support&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Account&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Sales&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Pre-Sales&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Marketing&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
 	                   </span><span class="str">"&lt;Department&gt;Finance&lt;/Department&gt;"</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> vbCr </span><span class="pun">&amp;</span><span class="pln"> vbLf </span><span class="pun">&amp;</span><span class="pln"> 
                       </span><span class="str">"&lt;/Departments&gt;"</span><span class="pln">

  </span><span class="typ">Dim</span><span class="pln"> xdoc </span><span class="typ">As</span><span class="pln"> </span><span class="typ">New</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">()</span><span class="pln">
  xdoc </span><span class="pun">=</span><span class="pln"> </span><span class="typ">XDocument</span><span class="pun">.</span><span class="typ">Parse</span><span class="pun">(</span><span class="pln">myXML</span><span class="pun">)</span><span class="pln">
 
  xdoc</span><span class="pun">.</span><span class="typ">Descendants</span><span class="pun">().</span><span class="typ">Where</span><span class="pun">(</span><span class="typ">Function</span><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span><span class="pln"> s</span><span class="pun">.</span><span class="typ">Value</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Sales"</span><span class="pun">).</span><span class="typ">Remove</span><span class="pun">()</span><span class="pln">

  </span><span class="typ">Dim</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> xdoc</span><span class="pun">.</span><span class="typ">Element</span><span class="pun">(</span><span class="str">"Departments"</span><span class="pun">).</span><span class="typ">Descendants</span><span class="pun">()</span><span class="pln">

  </span><span class="typ">For</span><span class="pln"> </span><span class="typ">Each</span><span class="pln"> item </span><span class="typ">As</span><span class="pln"> </span><span class="typ">XElement</span><span class="pln"> </span><span class="typ">In</span><span class="pln"> result
     </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Department Name - "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Next</span><span class="pln">

  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">vbLf </span><span class="pun">&amp;</span><span class="pln"> </span><span class="str">"Press any key to continue."</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">ReadKey</span><span class="pun">()</span><span class="pln">
  

End Sub

End Module

编译并执行以上C#或VB的代码时,将产生以下输出-

Department Name - Support
Department Name - Account
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

参考链接

www.learnfk.com/linq/linq-x…