快速业务通道

LINQ学习笔记:投射到X-DOM

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

投射到X-DOM

我们可以将LINQ查询投射到一个X-DOM. 其数据源可以是LINQ支持的任何一种, 例如:

  • LINQ to SQL 表
  • 本地集合
  • 另外一个X-DOM

不管是那种数据源, 使用LINQ投射一个X-DOM的策略是一样的: 你首先需要编写一个构建表达式用于产生需要的X-DOM形状, 然后围绕这个表达式编写LINQ查询

例如, 假设我们想从一个数据库当中查询客户并产生相应的XML:

   1: <customers>
   2:   <customer id="1">
   3:     <name>Sue</name>
   4:     <buys>3</buys>
   5:   </customer>
   6: </customers>

我们开始使用简单的文字为该X-DOM编写一个功能性的构造表达式:

   1: var customers =
   2:   new XElement ("customers",
   3:     new XElement ("customer", new XAttribute ("id", 1),
   4:       new XElement ("name", "Sue"),
   5:       new XElement ("buys", 3)
   6:     )
   7:   );

然后我们将其转换成为一个影射创建LINQ查询:

   1: var customers =
   2:   new XElement ("customers",
   3:     from c in dataContext.Customers
   4:     select
   5:       new XElement ("customer",
   6:         new XAttribute ("id", c.ID),
   7:         new XElement ("name", c.Name),
   8:         new XElement ("buys", c.Purchases.Count)
   9:       )
  10:     );

最后的结果可能类似:

   1: <customers>
   2:   <customer id="1">
   3:     <name>Tom</firstname>
   4:     <buys>3</buys>
   5:   </customer>
   6:   <customer id="2">
   7:     <name>Harry</firstname>
   8:     <buys>2</buys>
   9:   </customer>
  10:     ...
  11: </customers>

在这个例子中外部的查询使得查询从远程的LINQ to SQL转换成了本地的可枚举查询. XElement的构造器并不知道IQueryable<>, 因此它将导致LINQ to SQL立即执行SQL语句.

消灭空元素

假设前面的例子我们还想要包括客户最近的高价值的采购单的信息, 我们可以这样做:

   1: var customers =
   2:   new XElement ("customers",
   3:     from c in dataContext.Customers
   4:     let lastBigBuy = (from p in c.Purchases
   5:                      where p.Price > 1000
   6:                      orderby p.Date descending
   7:                      select p).FirstOrDefault()
   8:     select
   9:       new XElement ("customer",
  10:         new XAttribute ("id", c.ID),
  11:         new XElement ("name", c.Name),
  12:         new XElement ("buys",c.Purchases.Count),
  13:         new XElement ("lastBigBuy",
  14:           new XElement("description",
  15:             lastBigBuy == null
  16:               ? null: lastBigBuy.Description),
  17:           new XElement("price",
  18:             lastBigBuy == null
  19:               ? 0m :lastBigBuy.Price)
  20:         )
  21:       )
  22:   );
  23:

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号