快速业务通道

LINQ学习笔记:创建更加复杂查询的策略

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

有3种策略可以应用于创建更加复杂的查询:

逐步创建 /使用into关键字/包装多个查询

逐步创建

之前我们曾演示过如何逐步的创建一个Lambda查询

   1: string[] players = { "Tim Ducan", "Lebrom James", "Kobe Byrant" };
   2:     var filtered = players.Where (n => n.Contains ("a"));
   3:     var sorted = filtered.OrderBy (n => n);
   4:     var query = sorted.Select (n => n.ToUpper());

因为每一个参与的查询操作符都返回一个装饰序列, 其结果和你使用的单一的链式或多层装饰器的查询结果是一致的. 这里有几个潜在的好处, 如果你逐步的创建查询的话:

1. 查询更加简单容易编写

2. 可以有条件的添加查询操作符

在复合查询中使用逐步构造通常是很有用的做法. 为了演示, 假设我们想要使用正则表达式将所有的元音从一系列的名字中移除, 然后按字母排序并列出那些长度仍然大于2的名字. 使用Lambda语法, 我们可以使用一个单一的表达式完成:

   1: string[] names = { "James","Jack","Landy","C.Y","Jay" };
   2: IEnumerable<string> query = names
   3:   .Select  (n => Regex.Replace (n, "[aeiou]", ""))
   4:   .Where   (n => n.Length > 2)
   5:   .OrderBy (n => n);
   6:  
   7: foreach(var name in query)
   8: {
   9:     Console.WriteLine(name); //C.Y,Jck,Jms,Lndy
  10: }

如果我们将它直接翻译成复合查询语法的话会碰到一些问题, 因为复合查询语句必须按照where-orderby-select的顺序出现编译器才能正确编译. 但是如果我们简单的按这个要求重新排列的话, 结果将会不一样:

   1: string[] names = { "James","Jack","Landy","C.Y","Jay" };    IEnumerable<string> query =
   2:   from    n in names
   3:   where   n.Length > 2
   4:   orderby n
   5:   select  Regex.Replace (n, "[aeiou]", "");
   6:  
   7: foreach(var name in query)
   8: {
   9:     Console.WriteLine(name); //C.Y,Jck,Jms,Jy,Lndy    
  10: }

幸运的是使用复合查询语法我们还可以有很多的方法可以得到跟上述查询一致的结果. 这其中的第一种就是使用逐步构造查询

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