LINQ学习笔记:投射到X-DOM
投射到X-DOM 我们可以将LINQ查询投射到一个X-DOM. 其数据源可以是LINQ支持的任何一种, 例如:
不管是那种数据源, 使用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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |