现在的位置: 首页 > 综合 > 正文

LinQ入门总结

2013年05月03日 ⁄ 综合 ⁄ 共 2312字 ⁄ 字号 评论关闭
文章目录

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;

 参考文献1
参考文献2

抱歉!评论已关闭.