• Linq之 Linq to Object


    Enumerable类,针对IEnumerable数据,指的是内存数据 

    Linq 其实就是把对数据操作的通用部分完成,把可变的交给委托,使用者只用关心可变部分,其实Linq就是这么一个封装,但确实很好用.

    我们通过反编译就能能清晰的看出

    WHERE

    Where:把对数据过滤的通用操作完成,把可变的过滤逻辑交给委托

    Where是限制操作符,它将过滤标准应用在序列上,按照提供的逻辑对序列中的数据进行过滤。

    Where操作符不启动查询的执行。当开始对序列进行遍历时查询才开始执行,此时过滤条件将被应用到查询中。

    LINQ有两种方式实现,没有什么区别,主要是个人习惯。

    示例1

    var list = studentList.Where<Student>(s => s.Age < 30);//陈述句   言出法随 封装的好

          

    示例2(这里更类似于SQL语句,编译后会形成和示例1一样的形式):

     Var  list= from s  in studentList

             Where  s.age<30

              Select s;

    SELECT 投影

     Select:把对数据转化的通用操作完成,把可变的转换逻辑交给委托

           示例:

               {

                    //这里有一堆学生  每个学生都转换成别的对象

                    var list = studentList.Where<Student>(s => s.Age < 30)

                    //此处可以理解为,把上面筛选出的结果集再转换成

                   //另外一种类型

                         .Select(s => new  

                           {

                             IdName = s.Id + s.Name,

                            ClassName = s.ClassId == 2 ? "高级" : "其他"

                               });

                 }

                {

                 示例2:

                    var list = from s in studentList

                               where s.Age < 30

                               select new

                               {

                                   IdName = s.Id + s.Name,

                                   ClassName = s.ClassId == 2 ? "高级班" : "其他班"

                               };

                }

     以上两种方法,并没有存在任何差别,只是个人习惯,第一种称之为方法式,第二种称之为表达式形式

    OrderBy和分页

    类似于SQL,具体语法如下

          var list = studentList.Where<Student>(s => s.Age < 30)//条件过滤

                     .Select(s => new//投影

                        {

                          Id = s.Id,

                          ClassId = s.ClassId,

                          IdName = s.Id + s.Name,

                          ClassName = s.ClassId == 2 ? "高级" : "其他"

                         })

                          .OrderBy(s => s.Id)//排序

                           //.ThenBy//2个都生效

                          .OrderByDescending(s => s.ClassId)//倒排  最后一个生

                          .Skip(2)//跳过几条

                          .Take(3)//获取几条

                           ;

    group by

    示例:

       var list = from  in studentList

                 where s.Age < 30

                 group s by s.ClassId into sg

    //这里我们可以理解为分组之后的数据放到sg中去

                 select new

                 {

                     key = sg.Key,

                     maxAge = sg.Max(t => t.Age)

                 };

    Join

    需要注意,Linq中不能用==,只能用equals

    示例:

      var list = from s in studentList

                 join c in classList on s.ClassId equals c.Id//不能用==只能equals

                 select new

                 {

                     Name = s.Name,

                     CalssName = c.ClassName

                 };

    左连接

    需要注意:左连接需要把join的结果放入一个匿名类里

    然后from sc in scList.DefaultIfEmpty()//

    var list = from s in studentList

               join c in classList on s.ClassId equals c.Id

               into scList

               from sc in scList.DefaultIfEmpty()//

               select new

               {

                   Name = s.Name,

                CalssName = sc == null ? "无班级" : sc.ClassName//csc,为空则用

               };

  • 相关阅读:
    Add函数求两个数的和,不能使用+号或其它算术运算符
    小刘同学的第八十六篇博文
    小刘同学的第八十五篇博文
    小刘同学的第八十四篇博文
    小刘同学的第八十三篇博文
    小刘同学的第八十二篇博文
    小刘同学的第八十一篇博文
    小刘同学的第八十篇博文
    小刘同学的第七十九篇博文
    小刘同学的第七十八篇博文
  • 原文地址:https://www.cnblogs.com/JohnTang/p/10950398.html
Copyright © 2020-2023  润新知