LinQ入门
时间:2010-11-25 来源:麻将我会
LINQ查询语句实际上和我们常用的foreach语句相似:中间语言(IL)中并没有对应的foreach语句,编译器最终会将foreach语句转换为一些列的语句块,例如:
List<Student> students = new List<Student>{new Student { Name = "张三", Num = "001", Grade = "2" }, new Student { Name = "李四", Num = "002", Grade = "2" }, new Student { Name = "王五", Num = "003", Grade = "3" }}; foreach (var student in students) { Console.WriteLine(student.Name); }
转换为:
IEnumerator e = students.GetEnumerator(); while (e.MoveNext()) { Console.WriteLine(((Student)e.Current).Name); }
在.NET Framework 3.5中为IEnumerable<T>接口加入了大量的扩展方法,这些方法为LINQ提供了实现基础(就像IEnumerable中GetEnumerator方法为foreach提供实现基础一样); 例如,IEnumerable中的Where扩展方法,它和LINQ中的where子句对应,用于筛选数据:
IEnumerable<Student> query = students.Where(a => a.Name == "张三"); var query = from student in students where student.Name == "张三" select student;
上面的两种查询方式等效;
var关键字与匿名类型:
var关键字指示编译器推断出变量的类型,例如:
var s = "Hello";
编译器最终将s变量推断为String类型,即最终按
String s = "Hello";
来生成中间代码
在LINQ中我们可以通过var关键字来声明查询对象,而无需清楚最终我们查询返回的具体类型:
var query = from student in students where student.Name == "张三" select student;
另一种情况,有时我们只需要返回对象的某些属性,这时我们无需定义返回数据的类型,直接使用匿名类型:
var x = new { F1 = "hello", F2 = "xiaojie" }; Console.WriteLine(x.F1);
var query = from student in students select new { Number=student.Num}; foreach (var s in query) { Console.WriteLine(s.Number); }
LinQ的延迟查询:
上述例子中LINQ语句是在foreach语句时才真正执行的,定义时只是定义了查询语句,在进入foreach枚举时才真正执行查询语句。如果我们在定义时需要立即返回查询结果可以使用ToArray或ToList方法(这两个方法也是在.Net Fromework 3.5中为IEnumerable接口新增的扩展方法)。
var query = (from student in students select new { Number=student.Num}).ToArray();
LINQ中的筛选:
LINQ中通过where子句筛选数据,where子句后跟条件,from后的对象都可作为where子句判断条件的主体: 例如筛选出所有班级为2的学生信息:var query = from student in students where student.Grade =="2" select student;
当然,并不是说条件语句中只能使用from后的对象,它可以使用任何对象作为判断依据:例如:
string str = "str"; var query = from student in students where str=="str" select student;
嵌套查询:
var query = from student in students where (from course in courses where course.CourseName =="经济学" select course.Num).Contains(student.Num) select student;查询选修了经济学的学生信息,上例中使用了嵌套查询,students where语句中包含另一个LINQ语句,该语句从courses集合中返回选修了语文课程的学号,它是一个IEnumerable<String>集合,所以可以在此集合上使用IEnumerable的Contains方法,判断集合中是否包含当前student对象的ID,包含则返回true,即students的where语句为真,该student对象被添加入结果集合,反之不添加;
LInQ排序:
排序语句比较简单,基本语法为: orderby .. ascending | descending,其中ascending表示升序排列,descending表示降序排列:
单字段排序:
var querys = from student in students orderby student.Name descending select student;多字段排序:
var querys = from student in students orderby student.Name descending ,student.Num ascending select student;