zoukankan      html  css  js  c++  java
  • LinQ学习笔记(二)

    前言                    


            学习了数组的查询之后。前面就知道了Linq数据源必须是是可枚举的——即必须是数组和集合以便从中选择一个。所以接下学习的就是集合了。集合里面最常见的就是对象了,那么我们就针对对象查询,也是项目中很常用的。

    正文            


    1.查询的是对象

       那么首先建立对象,再对其进行查询

       1:  using System;
       2:  using System.Collections.Generic;
       3:  using System.Linq;
       4:  using System.Text;
       5:  using System.Threading.Tasks;
       6:  using System.IO;
       7:   
       8:  namespace ConsoleApplication1
       9:  {
      10:      class LinqTest2
      11:      {
      12:          static void Main(string[] args)
      13:          {
      14:              List<Student> students = new List<Student> { 
      15:              new Student{Id=123,Name="李山",Info="学习成绩一般",Grade="1年级"},
      16:              new Student{Id=123,Name="李四",Info="学习成绩良好",Grade="2年级"},
      17:              new Student{Id=12345,Name="李五",Info="学习成绩一般",Grade="3年级"},
      18:              new Student{Id=12346,Name="李六",Info="学习成绩优秀",Grade="6年级"}, 
      19:              new Student{Id=12789,Name="李七",Info="学习成绩优秀",Grade="5年级"},
      20:   
      21:              };
      22:          /////////////////////////////////////////////////////////
      23:          //第一种原始的查询方法。很像sql查询语句,只不过这里用的是对象
      24:          var queryResults= from c in students
      25:                            where c.Id==123
      26:                            select c  //此处是查询整个对象
      27:                                ;
      28:          foreach(Student s in queryResults)
      29:          {
      30:              Console.WriteLine(s);//这里输出的是c默认调用其ToString()的方法,不复写这输出类名
      31:              //Console.WriteLine("Student{0}:{1},{2}",s.Id,s.Name,s.Info);
      32:          }
      33:          /////////////////////////////////////////////////////////
      34:              Console.ReadKey();
      35:          }
      36:      }
      37:      class Student 
      38:      {
      39:   
      40:          public int Id { get; set; }
      41:          public string Name { get; set; }
      42:          public string Info { get; set; }
      43:          public string Grade { get; set; }
      44:   
      45:          public override string ToString()
      46:          {
      47:   
      48:              return "ID:" + Id + "Name:" + Name + "Info" + Info + "Grade" + Grade;
      49:          }
      50:   
      51:      }
      52:  }

    结果:

    ID:123Name:李山Info学习成绩一般Grade1年级
    ID:123Name:李四Info学习成绩良好Grade2年级

    2  查询的是对象中某个属性或者是表达式

       1:          ///////////////////////////////////////////////////////////////
       2:              var queryResults= from c in students
       3:                                select c.Id+1  //表达式
       4:                                //select c.Id  //查对象的Id
       5:                                //select c.Name.ToUpper() //对对象中得Name属性进行操作
       6:                                    ;
       7:              foreach (int s in queryResults)//相应的这里也要做类型转变
       8:              {
       9:                  Console.WriteLine(s);
      10:              }
      11:          ///////////////////////////////////////////////////////////////
      12:              Console.ReadKey();

    结果:

    124
    124
    12346
    12347
    12790

    3  查询的时多字段,多属性需要投影——在查询中创建新的对象

       1:              ///////////////////////////////////////////////////////////////
       2:              //方法一查询方法:
       3:              //var queryResults = from c in students
       4:              //                   where c.Id==123
       5:              //                   select new { c.Id, c.Name }  //多字段查询
       6:              //                   ;
       7:              //方法二方法语法:
       8:              var queryResults = students.Where(c => c.Id == 123).Select(c=>new {c.Id,c.Name });
       9:              foreach (var s in queryResults)//此处的对象类型 变为var
      10:              {
      11:                  Console.WriteLine(s);
      12:              }
      13:              ///////////////////////////////////////////////////////////////
      14:              Console.ReadKey();

    结果:

    { Id = 123, Name = 李山 }
    { Id = 123, Name = 李四 }

    说明:

    1.students.Where(c => c.Id == 123).Select(c=>new {c.Id,c.Name });对于where条件和select方法可以互换,但是是从左到右执行的。也就是说先在where的条件下所得的结果集后在执行select方法在得到结果;

    2.但是发现Select(c=>new {c.Id+1,c.Name });其中c.Id+1是不可行的,必须要新建新的列才可以,如下:

       1:              var queryResults = students.Where(c => c.Id == 123)
       2:                                         .Select(c => new {ID=c.Id+1,c.Name,nameInfo=c.Name+c.Info });

    结果:

    { ID = 124, Name = 李山, nameInfo = 李山学习成绩一般 }
    { ID = 124, Name = 李四, nameInfo = 李四学习成绩良好 }

    4  其他方法  

    1.Distinct()   去除完全相同的列

    使用:

       var queryResults = students.Where(c => c.Id == 123).Select(c=>new {c.Id, c.Name }).Distinct();

    或者

    var queryResults = (from c in students   where c.Id == 123   select new { c.Id, c.Name }).Distinct();

    2. Any()和All()  两个布尔方法,快速确定数据的某个条件是否为true或者false

       1:              bool allId = students.All(c => c.Id == 123);//students中的全部的Id是否都为123,是返回true,否则false
       2:              bool anyId = students.Any(c => c.Id == 123);//students中的某些Id是否为123,是返回true,否则false
       3:              Console.WriteLine(allId);
       4:              Console.WriteLine(anyId);
       5:              Console.ReadKey();

    结果:

    False
    True

    3.ThenBy()   多级排序方法

       1:              var queryResults = students.Select(c => c)
       2:                                         .OrderByDescending(c=>c.Id)//首次排序以Id为降序
       3:                                         .ThenByDescending(c=>c.Name)//次之以Name降序
       4:                                         .ThenBy(c=>c.Info);//在此之以Info升序
       5:              foreach (var s in queryResults)//此处的对象类型可为var,也可为Student,方便起见使用var
       6:              {
       7:                  Console.WriteLine(s);
       8:              }

    结果:

    ID:12789Name:李七Info学习成绩优秀Grade5年级
    ID:12346Name:李六Info学习成绩优秀Grade6年级
    ID:12345Name:李五Info学习成绩一般Grade3年级
    ID:123Name:李四Info学习成绩良好Grade2年级
    ID:123Name:李山Info学习成绩一般Grade1年级

    4.Take(n)   提取结果集中前n个数据

       Skip(n)   提取结果集中除去前n个数据后剩下的数据

    使用:(注意是对结果集操作)

    queryResults.Take(5);

    queryResults.Skip(5);

    5.First()   返回结果集中第一个匹配给定条件的元素,没有这报异常

      FirstOrDefault()   与上面一样,只是没有的时候返回Null

    使用:(注意返回的是一个对象啊)

    var queryResults = students.First(c => c.Id == 123);

    var queryResults = students.FirstOrDefault(c => c.Id == 123);

    4  组合查询 OrderBy    

    为演示效果,重写代码,代码如下

    创建新的类

       1:      class ClassRoom
       2:      {
       3:   
       4:          public int Id { get; set; }
       5:          public string Name { get; set; }
       6:          public int StuId { get; set; }
       7:          public int Math { get; set; }
       8:          public int English { get; set; }
       9:   
      10:      }

    Main方法中:

       1:              List<ClassRoom> students = new List<ClassRoom> { 
       2:              new ClassRoom{Id=1,StuId=123,Name="李三",Math=85,English=69},
       3:              new ClassRoom{Id=1,StuId=125,Name="李四",Math=82,English=99},
       4:              new ClassRoom{Id=1,StuId=124,Name="李五",Math=81,English=82},
       5:              new ClassRoom{Id=2,StuId=126,Name="李流",Math=88,English=85},
       6:              new ClassRoom{Id=2,StuId=127,Name="李气",Math=95,English=81},
       7:              new ClassRoom{Id=2,StuId=128,Name="李八",Math=65,English=88},
       8:              new ClassRoom{Id=2,StuId=129,Name="李一",Math=75,English=83},        
       9:              };
      10:              ////////////////////////////////////////////////////////////////
      11:              var queryResults = from c in students
      12:                                 group c by c.Id into classroom //产生一个新的结果集classroom方便做运算
      13:                                 select new { classid = classroom.Key, totleManth = classroom.Sum(c => c.Math), totleEnglish = classroom.Sum(c => c.English) };
      14:              foreach (var s in queryResults)//此处的对象类型可为var,也可为Student,方便起见使用var
      15:              {
      16:                  Console.WriteLine(s);
      17:              }
      18:              ////////////////////////////////////////////////////////////////////////
      19:              Console.ReadKey();
     

    结果:

    { classid = 1, totleManth = 248, totleEnglish = 250 }
    { classid = 2, totleManth = 323, totleEnglish = 337 }

    注解:

    1、select new { classid = classroom.Key,//这里的Key指的就是 group c by 后面的c.Id

                       totleManth = classroom.Sum(c => c.Math), //使用新的结果集做

                       totleEnglish = classroom.Sum(c => c.English) };

    附注:        

    OK关于集合的中得对象的LinQ就到这里吧!

  • 相关阅读:
    14.4.9 Configuring Spin Lock Polling 配置Spin lock 轮询:
    14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate
    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
  • 原文地址:https://www.cnblogs.com/qhyhao/p/2754161.html
Copyright © 2011-2022 走看看