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;