LINQ匿名类型分析

开发 后端
这里介绍使用LINQ匿名类型来自定义LINQ查询输出的基本例子。下面的示例提供了一个更复杂和更实际的场景。

在向大家详细介绍LINQ匿名类型之前,首先让大家了解下LINQ查询输出的基本例子,然后全面介绍LINQ匿名类型。

本文介绍使用LINQ匿名类型来自定义LINQ查询输出的基本例子。下面的示例提供了一个更复杂和更实际的场景。它把我们的城市列表转换成一个分层的结果集合──我们将使用一个LINQ匿名类型来对结果按国家分组,这个LINQ匿名类型包含了一个国家名称,一个城 市详细信息的子集合和在这个国家中所有城市距离的总和,这距离之和将通过第五步中示范过的lambda表达式 来计算:

  1. using System;  
  2. using System.Web.UI;  
  3. using System.Query;  
  4.    
  5. public partial class Step7 : System.Web.UI.Page  
  6. {  
  7. protected void Page_Load(object sender, EventArgs e)  
  8. {  
  9. TravelOrganizer travel = new TravelOrganizer();  
  10.    
  11. GridView1.DataSource = from location in travel.PlacesVisited  
  12. & nbsp; group location by location.Country into loc  
  13. & nbsp; select new {  
  14. & nbsp; & nbsp; Country = loc.Key,  
  15. & nbsp; & nbsp; Cities = loc,  
  16. & nbsp; & nbsp; TotalDistance = loc.Sum(dist => dist.Distance)  
  17. & nbsp; };  
  18.  
  19. GridView1.DataBind();  
  20. }  

我们.aspx页面中的GridView是这样定义的:

  1. <%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="Step7.aspx.cs" Inherits="Step7" %> 
  2.    
  3. <html> 
  4. <body> 
  5. <form id="form1" runat="server"> 
  6. <div> 
  7. <h1>Groupings with Anonymous Classes</h1> 
  8.    
  9. <asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server"> 
  10. <Columns> 
  11.    
  12. <asp:BoundField HeaderText="Country" DataField="Country" /> 
  13.    
  14. <asp:TemplateField HeaderText="Cities"> 
  15. & nbsp;<ItemTemplate> 
  16. & nbsp;   
  17. & nbsp;<asp:BulletedList ID="BulletedList1" runat="server" 
  18. & nbsp; & nbsp;DataSource='<%#Eval("Cities")%>' DataValueField="City"/> 
  19. & nbsp;   
  20. & nbsp;</ItemTemplate> 
  21. </asp:TemplateField> 
  22.    
  23. <asp:BoundField HeaderText="Total Distance" DataField="TotalDistance" /> 
  24.    
  25. </Columns> 
  26. </asp:GridView> 
  27. </div> 
  28. </form> 
  29. </body> 
  30. </html> 

注意,我在GridView的模版列中添加了一个"Cities"列,并且在其中添加了一个<asp:bulletedlist>控件 (一个新的ASP.NET 2.0自带控件)来绑定在上面用LINQ查询所得到的分层结果。

注意,所有上面的绑定语法和层次绑定在现在的ASP.NET 2.0中是完全支持的,所以,你可以在现有的程序中使 用这些技术。新颖(我也认为非常酷)之处,是LINQ匿名类型和LINQ提供的数据构形功能,这个功能使得在ASP.NET 控件里绑定分层数据非常容易。

上面所有的例子操作的都是本地内存中的集合数据。他们展示了你如何在.NET对象模型中使用LINQ,包括那些你 自己创建的类型。

在我将来的有关LINQ的文章中,我将深入讨论LINQ,利用新的DLINQ支持使用上面提到的技术来处理关系数据库 ,和通过新的XLINQ支持来处理XML文件和结构。LINQ项目的好处在于,在所有的应用中,其句法和概念都是一 样的,这样,你一旦学会使用LINQ对一个数组或集合做查询,你也就知道了在处理数据库甚至XML文件时所需 的所有概念。

例如,假如你使用DLINQ生成了Northwinds数据库中供应商(Suppliers)和产品( Products)表相对应的.NET类型(注:你不需要编写任何代码就可以实现),那么要获取分层的数据结果,并且将其绑定到GridView上,你只要写下面这个编码就可以了(注意:我们使用了跟前面的例子一样的数据构形技术,只从数据库中取得两列数据,并且自动地把每个供应商和其对应的产品组合成一个层次结构的结 果):

  1. using System;  
  2. using System.Query;  
  3.    
  4. public partial class Data_Data2 : System.Web.UI.Page  
  5. {  
  6. protected void Page_Load(object sender, EventArgs e)  
  7. {  
  8. Northwind db = new Northwind();  
  9.    
  10. GridView1.DataSource = from x in db.Suppliers  
  11. & nbsp; where x.Country == "USA"  
  12. & nbsp; orderby x.Country  
  13. & nbsp; select new {  
  14. & nbsp; & nbsp;x.CompanyName,  
  15. & nbsp; & nbsp;x.Country,  
  16. & nbsp; & nbsp;x.Products  
  17. & nbsp;};  
  18.    
  19. GridView1.DataBind();  
  20. }  

不需要额外的SQL语句和代码──这些就是实现高效获取和组装层次数据所需的所有代码(注意:只取出了需要的 列和行的数据-DLINQ可以使用LINQ的远程函数支持因而我们没必要持久化或者取出所有数据库表或者一行中 的所有列)。而且这些都是类型安全的,同样具有完全的编译时检查,智能感知和调试支 持。

更棒的是,接入一个新的LINQ提供器(DLINQ和XLINQ是两例)的机制是完全公开的──因此那些已经建立或者使用现 有数据提供程序(例如:O/R数据库映射)的开发人员可以很容易的无缝地把他们的实现和LINQ整合起来。一 旦你了解了LINQ,你就知道了开发LINQ所需的所有的基本知识。

【编辑推荐】

  1. LINQ to SQL Table浅谈
  2. Linq语句问题的解决方法
  3. Ling to sql更新实体概述
  4. Linq实体继承简单描述
  5. Linq Library概述
责任编辑:佚名 来源: 博客园
相关推荐

2009-09-10 14:37:57

LINQ匿名类型

2009-09-14 15:50:52

Linq匿名委托类型

2009-09-11 10:16:07

Linq匿名类型

2009-09-17 11:35:40

Linq匿名类型

2009-09-10 13:24:36

Linq参数类型

2009-09-01 10:58:46

C#匿名类型对象

2009-09-07 16:44:28

Linq String

2009-08-10 17:25:58

C#匿名类型

2009-09-08 14:56:55

强类型DataContLinq to SQL

2009-09-15 15:09:50

Linq本质

2009-09-09 18:03:47

LINQ to SQL

2009-09-09 17:02:05

LINQ Expres

2009-09-15 10:46:04

LINQ to SQL

2009-09-14 10:09:26

LINQ查询结果

2009-09-08 13:16:01

Linq to SQL

2009-08-26 15:46:01

C#匿名类型

2009-09-16 15:41:45

LINQ查询XML文档

2009-09-18 16:46:15

LINQ查询句法

2009-09-14 18:53:27

LINQ查询

2009-09-17 11:29:50

Linq扩展方法
点赞
收藏

51CTO技术栈公众号