代码改变世界

Linq学习笔记(二)Linq To Objects 基础

2009-11-15 14:50  Henry Cui  阅读(338)  评论(1编辑  收藏  举报

在上篇文章中我们初步接触了Linq查询表达式的语法,在这一篇文章中将会详细说明Linq查询中的各个关键字。

必备知识

C#3.0新特性

本次使用的基础数据还是跟上一篇中一样,详细看下BaseData中的数据(代码2.1):

  1. public class BaseData
  2.     {
  3.        
  4.         public static Projects[] ProjectList =
  5.         {
  6.             new Projects{ProjectsID="CAMS_NT",ProjectsName="信息系统-NT",CreateDate=new DateTime(2008,1,3)},
  7.             new Projects{ProjectsID="CAMS_WX",ProjectsName="信息系统-WX",CreateDate=new DateTime(2008,5,3)},
  8.             new Projects{ProjectsID="WMS",ProjectsName="仓储系统",CreateDate = new DateTime(2009,5,3)}
  9.         };
  10.  
  11.         private static Modules EmployeeManager = new Modules
  12.         {
  13.             Project = ProjectList[0],
  14.             ModuleID = "EmployeeManager",
  15.             ModuleName = "员工管理",
  16.             IsHaveChild = true,
  17.             CreateDate = DateTime.Now
  18.         };
  19.  
  20.  
  21.         public static Modules[] ModuleList =
  22.         {
  23.             EmployeeManager,
  24.             new Modules{
  25.                 Project  = ProjectList[0],
  26.                 ParentModule = EmployeeManager,
  27.                 ModuleID="EmployeeBasicInfo",ModuleName="员工基础信息管理",IsHaveChild=true,CreateDate=DateTime.Now
  28.             }
  29.         };
  30.  
  31.         public static Functions[] FunctionList =
  32.         {
  33.             new Functions{
  34.                 Module = ModuleList[1],
  35.                 FuncID="AddUser",FuncName="新增员工"
  36.             },
  37.             new Functions{
  38.                 Module = ModuleList[1],
  39.                 FuncID="ModifyUser",FuncName="修改员工"
  40.             }
  41.         };
  42.     }

 

常用的操作符

1.Where

Where操作符的作用就是通过某些条件的判断对序列中的元素进行过滤。Where的扩展方法申明如下(代码2.2):

  1. public static IEnumerable<T> Where<T>(
  2.     this IEnumerable<T> source,
  3.     Func<T, bool> predicate
  4.     );

我们可以看到where是定义在IEnumerable类型上的扩展方法,where的参数为一个Func<T,bool>类型的委托,也就是说为一个返回值为bool类型参数为T类型的方法(可以通过这篇文章来了解扩展方法和这篇文章来理解委托)。

示例(代码2.3):

  1. var projectnames = BaseDate.BaseData.ProjectList.Where(project => project.ProjectsID.StartsWith("CAMS"))
  2.     .Select(project => project.ProjectsName);

在查询表达式中(代码2.4):

  1. var projectnames = from project in BaseData.ProjectList
  2.                                where project.ProjectsID.StartsWith("CAMS")
  3.                                select project.ProjectsName;

 

另外Where操作符还有一个重载(代码2.5):

  1. public static IEnumerable<T> Where<T>(
  2.     this IEnumerable<T> source,
  3.     Func<T,int, bool> predicate
  4.     );

这里面就是多了一个int类型参数,它是表示元素在序列中的位置,元素是从0开始的,在上面的查询中我们查到的结果是:

image

我们使用重载的方法(代码2.6):

  1. var projectnames = BaseDate.BaseData.ProjectList
  2.     .Where((project, index) => project.ProjectsID.StartsWith("CAMS") && index==1)
  3.     .Select(project => project.ProjectsName);

我们可以看到结果是:

image

2.Select

Select操作的主要作用就是进行投影。Select的申明如下(代码2.7):

  1. public static IEnumerable<S> Select<T, S>(
  2.         this IEnumerable<T> source,
  3.         Func<T, S> selector
  4.     );

在申明中我们可以理解到返回S类型的IEnumerable,在大部分投影操作我们会用到匿名类型(通过这篇文章可以了解匿名类型)其实我们在上面的几段代码中已经使用过了where操作,这里就不再举例了。

跟Where一样Select操作也提供了查询索引的功能,我们来看一个例子(代码2.8):

  1. var projectnames = BaseDate.BaseData.ProjectList
  2.     .Where((project) => project.ProjectsID.StartsWith("CAMS"))
  3.     .Select((project, index) => new { project.ProjectsName,index });
  4. foreach (var proname in projectnames)
  5. {
  6.     Console.WriteLine(proname.index+" "+proname.ProjectsName);
  7. }

结果:

image

3.Orderby

orderby可以指定多种排序方式。我们来看下示例(代码2.9):

  1. var projects = BaseData.ProjectList.OrderBy(project => project.CreateDate)
  2.     .ThenByDescending(project => project.ProjectsName);
  3. foreach (var project in projects)
  4. {
  5.     Console.WriteLine(project.ProjectsID + " " + project.ProjectsName + " " + project.CreateDate);
  6. }

 

我们也可以用表达式的方式来写(代码2.10):

  1. var projects = from project in BaseData.ProjectList
  2.                orderby project.CreateDate, project.ProjectsName descending
  3.                select project;
  4. foreach (var project in projects)
  5. {
  6.     Console.WriteLine(project.ProjectsID + " " + project.ProjectsName + " " + project.CreateDate);
  7. }

 

总结

本文中,主要对Select、Where、OrderBy这三个常用的操作符进行了详细的说明,本章主要说的基础,在下篇文章中将会详细说明其他的一些查询操作如:嵌套查询、连接查询、分组等。