在上篇文章中我们初步接触了Linq查询表达式的语法,在这一篇文章中将会详细说明Linq查询中的各个关键字。
必备知识
C#3.0新特性
本次使用的基础数据还是跟上一篇中一样,详细看下BaseData中的数据(代码2.1):
- public class BaseData
- {
- public static Projects[] ProjectList =
- {
- new Projects{ProjectsID="CAMS_NT",ProjectsName="信息系统-NT",CreateDate=new DateTime(2008,1,3)},
- new Projects{ProjectsID="CAMS_WX",ProjectsName="信息系统-WX",CreateDate=new DateTime(2008,5,3)},
- new Projects{ProjectsID="WMS",ProjectsName="仓储系统",CreateDate = new DateTime(2009,5,3)}
- };
- private static Modules EmployeeManager = new Modules
- {
- Project = ProjectList[0],
- ModuleID = "EmployeeManager",
- ModuleName = "员工管理",
- IsHaveChild = true,
- CreateDate = DateTime.Now
- };
- public static Modules[] ModuleList =
- {
- EmployeeManager,
- new Modules{
- Project = ProjectList[0],
- ParentModule = EmployeeManager,
- ModuleID="EmployeeBasicInfo",ModuleName="员工基础信息管理",IsHaveChild=true,CreateDate=DateTime.Now
- }
- };
- public static Functions[] FunctionList =
- {
- new Functions{
- Module = ModuleList[1],
- FuncID="AddUser",FuncName="新增员工"
- },
- new Functions{
- Module = ModuleList[1],
- FuncID="ModifyUser",FuncName="修改员工"
- }
- };
- }
常用的操作符
1.Where
Where操作符的作用就是通过某些条件的判断对序列中的元素进行过滤。Where的扩展方法申明如下(代码2.2):
- public static IEnumerable<T> Where<T>(
- this IEnumerable<T> source,
- Func<T, bool> predicate
- );
我们可以看到where是定义在IEnumerable类型上的扩展方法,where的参数为一个Func<T,bool>类型的委托,也就是说为一个返回值为bool类型参数为T类型的方法(可以通过这篇文章来了解扩展方法和这篇文章来理解委托)。
示例(代码2.3):
- var projectnames = BaseDate.BaseData.ProjectList.Where(project => project.ProjectsID.StartsWith("CAMS"))
- .Select(project => project.ProjectsName);
在查询表达式中(代码2.4):
- var projectnames = from project in BaseData.ProjectList
- where project.ProjectsID.StartsWith("CAMS")
- select project.ProjectsName;
另外Where操作符还有一个重载(代码2.5):
- public static IEnumerable<T> Where<T>(
- this IEnumerable<T> source,
- Func<T,int, bool> predicate
- );
这里面就是多了一个int类型参数,它是表示元素在序列中的位置,元素是从0开始的,在上面的查询中我们查到的结果是:
我们使用重载的方法(代码2.6):
- var projectnames = BaseDate.BaseData.ProjectList
- .Where((project, index) => project.ProjectsID.StartsWith("CAMS") && index==1)
- .Select(project => project.ProjectsName);
我们可以看到结果是:
2.Select
Select操作的主要作用就是进行投影。Select的申明如下(代码2.7):
- public static IEnumerable<S> Select<T, S>(
- this IEnumerable<T> source,
- Func<T, S> selector
- );
在申明中我们可以理解到返回S类型的IEnumerable,在大部分投影操作我们会用到匿名类型(通过这篇文章可以了解匿名类型)其实我们在上面的几段代码中已经使用过了where操作,这里就不再举例了。
跟Where一样Select操作也提供了查询索引的功能,我们来看一个例子(代码2.8):
- var projectnames = BaseDate.BaseData.ProjectList
- .Where((project) => project.ProjectsID.StartsWith("CAMS"))
- .Select((project, index) => new { project.ProjectsName,index });
- foreach (var proname in projectnames)
- {
- Console.WriteLine(proname.index+" "+proname.ProjectsName);
- }
结果:
3.Orderby
orderby可以指定多种排序方式。我们来看下示例(代码2.9):
- var projects = BaseData.ProjectList.OrderBy(project => project.CreateDate)
- .ThenByDescending(project => project.ProjectsName);
- foreach (var project in projects)
- {
- Console.WriteLine(project.ProjectsID + " " + project.ProjectsName + " " + project.CreateDate);
- }
我们也可以用表达式的方式来写(代码2.10):
- var projects = from project in BaseData.ProjectList
- orderby project.CreateDate, project.ProjectsName descending
- select project;
- foreach (var project in projects)
- {
- Console.WriteLine(project.ProjectsID + " " + project.ProjectsName + " " + project.CreateDate);
- }
总结
本文中,主要对Select、Where、OrderBy这三个常用的操作符进行了详细的说明,本章主要说的基础,在下篇文章中将会详细说明其他的一些查询操作如:嵌套查询、连接查询、分组等。