快速业务通道

BlogEngine.Net架构与源代码分析系列part9:开发扩展(上)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19

填充到具体类型

如果你想要得到一个中间结果,将数据填充到匿名类型当中是非常有用,但是如果要将结果集发送给客户端,则会有一些问题,因为匿名类型只能在一个方法内作为本地变量存在.一个代替的方法就是使用具体类型作为数据载体,例如DataSet或者自定义的实体类.一个业务实体类就是一个包含某些自定义属性的类型,类似于那些标记了[Table]注解的LINQ to SQL类型,它们被设计用于隐藏数据库的细节.我们可能在实体类中排除外键字段,例如,假设我们编写了叫做CustomerEntity和PurcahseEntity的实体类,以下示例显示我们如何运用实体类来搭载数据:

   1: IQueryable query =
   2:  
   3:          from c in dataContext.Customers
   4:  
   5:          select new CustomerEntity
   6:  
   7:          {
   8:  
   9:            Name = c.Name,
  10:  
  11:            Purchases = (
  12:  
  13:              from p in c.Purchases
  14:  
  15:              where p.Price > 1000
  16:  
  17:              select new PurchaseEntity
  18:  
  19:              {
  20:  
  21:                Description = p.Description,
  22:  
  23:                Value = p.Price
  24:  
  25:              }
  26:  
  27:            ).ToList( )
  28:  
  29:          };
  30:  
  31:  
  32:  
  33:          List result = query.ToList();

 

到目前为止,我们并没有使用Join或者SelectMany,这是因为我们正在维护的是一个层级数据.使用LINQ,我们经常可以比避免使用传统的SQL途径来生成二维数据结果集.

SelectMany

参数列表:

源序列: IEnumerable

结果选择器(Result Selector): TSource=>IEnumerabel 或者(TSource, int)=>IEnumerable(LINQ to SQL不支持)

概要:

SelectMany将多个子序列连接成一个扁平的输出序列.

对于每一个输入元素,Select生成一个输出元素,相反的,SelectMany则生成了0…n个的输出元素.这些0…n的元素来自于处理结果或者Lambda表达式产生的子序列

SelectMany可以被用于扩展子序列,平整嵌套集合,以及联合两个集合来生成一个扁平的输出序列. 假设我们有一个名称如下的名字列表:

   1: string[] fullNames =
   2:  
   3:     { “Anne Williams”, “John Fred Smith”, “Sue Green” };

 

我们希望能够将它转换为一个扁平的单字结果集,如下所示:

“Anne”,“Williams”,“John”,“Fred”,“Smith”,“Sue”,“Green”

SelectMany对于这个任务是非常理想的,因为对于每一个输入元素我们将会得到对应的多个输出元素 . 我们需要做的就是提供一个selector表达式来将输入元素转化为一个输出子序列.String.Split()可以很好的完成一个工作:

   1: string testInputElement = “Anne Williams”;
   2:  
   3: string[] childSequence  = testInputElement.Split( );
   4:  
   5:   // childSequence = { “Anne”, “Williams” };

 

完整示例如下:

   1: IEnumerable<string> query =
   2:  
   3:          fullNames.SelectMany (name => name.Split( ));
   4:  
   5:        foreach (string name in query)
   6:  
   7:          Console.Write (name + “,”);
   8:  
   9:          // 结果: Anne,Williams,John,Fred,Smith,Sue,Green,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号