LINQ学习第一天

 1.为什么学习LINQ

  先看个例子吧,假如你要从一个Person集合里面获取姓名中含有"z"的Person,一般我们遍历这个集合,然后把符合条件的Person对象添加到另一个集合,如下:

1  List<Person> listPerson = PersonHelper.GetAllPerson();
2  List<Person> matchList = new List<Person>(); 
3  foreach (Person person in listPersons)
4  {
5       if (person.Name.Contains("z"))
6       {
7            matchList.Add(person);
8       }
9  }

通过以上的代码就可以得到符合条件的Person对象,这是我们常用的方法。

下面是Linq的做法

1 List<Person> listPersons = PersonHelper.GetAllPerson();
2 IEnumerable<Person> matchList = null;
3 matchList = from person in listPerson where person.Name.Contains("z") select person;

2.LINQ表达式

LINQ表达式和SQL查询表面还是很相似,所有的LINQ表达式都必须有一个指定数据源的from字句和一个表示要获取数据的select字句(或者定义了数据要放入组的group子句),from子句被放在最前面:

1 matchList = from person in listPerson where person.Name.Contains("z") select person;

from子句确定了两部分信息,紧随in之后的字段表明了查询的数据源(这里就是Person的实例集合对象listPersons),而紧随from之后的字段为数据源中每个个体的假名,就是当前Person集合listPersons中每个实例的命名,之后构建表达式的其他部分时,就可以使用这个假名(例如:where person.Name.Contains("z")),紧随where之后的表达式就是过滤条件(类似于T-SQL中的where 相同),select后的字段就是要查询的字段(类似于T-SQL中的select)

3.LINQ查询

依然以上面的listPerson集合,几种查询的语句:

 1 查询单个字段的语句
 2 var data = from person in listPerson select person.Name;
 3 查询组合字段
 4 var data = from person in listPerson select person.Name+person.Age;
 5 别名(实际就是匿名类)
 6 var data = from person in listPerson select new { 姓名 = person.Name,年龄=person.Age };
 7 组合别名
 8 var data = from person in listPerson select new { 姓名和年龄 = (person.Name + person.Age) };
 9 已存在的类
10 var data = from person in listPerson select new PersonBase { Name = person.Name ,Age=person.Age,Sex=person.Sex };
11 使用构造函数
12 var data = from person in listPerson select new PersonBase(person.Name,person.Sex,person.Age);

 4.过滤和排序

 开始的例子就是用where把结果过滤为只包括那些匹配特定条件的记录

1 matchList = from person in listPerson where person.Name.Contains("z") select person;

 where字句类似于T-SQL的where字句,where字句接受一个表达式,他对集合里面的每项进行计算,如果结果为true,该项就会被包含在结果中,可以使用逻辑与(&&)以及逻辑(||)操作符组合多个条件表达式并且能够使用关系操作符(如<、<=、>以及>=),例如:

1 IEnumerable<Person> matchList =null;
2 matchList = from person in listPerson where person.Age > 20 && person.Age < 30 select person;//查询年龄在20-30之间的人

where子句也可以使用自己定义的方法,例如创建一个方法根据年龄判断是否成年大于界限为age=18,成年为true,未成年为false,下面的语句查询成年的人:

1 //定义判断的方法
2 private bool IsNotAdult(Person person) 
3 {
4       return person.Age >= 18;
5 }
6 //使用自定义方法
7 IEnumerable<Person> matchList =null;
8 matchList = from person in listPerson where IsNotAdult(person) select person ;

 LINQ排序使用关键字orderby,按指定的字段排序,默认为升序(ascending),降序(descending),使用方法,放在每个排序字段之后,例如以下语句,按照年龄大小降序排列,姓名升序排列

1 IEnumerable<Person> matchList =null;
2 matchList = from person in listPerson where IsNotAdult(person) orderby person.Age ascending, person.Name descending select person;

 

 

 

 

 

 

posted @ 2012-11-22 21:22  抬头仰望属于我的天空  阅读(421)  评论(2)    收藏  举报