LINQ查询技术入门

LINQ简介

LINQ能够解决什么问题

在NET平台开发中,面向对象编程语言与数据访问方法长期分离,数据访问通过SQL进行查询,这种嵌入SQL语句的方式极容易出现错误。

SQL和XML都有各自的查询语言,而对象没有自己的查询语言。

再比如,要从List<T>集合或数组中找到符合要求的元素,非常困难。

什么是LINQ

LINQ(Language Integrated Query,语言集成查询)

LINQ主要包含以下三个部分:

  • LINQ to Objects主要负责对象的查询;
  • LINQ to XML主要负责XML的查询;
  • LINQ to ADO.NET主要负责数据库的查询;
    • (1)LINQ to SQL;
    • (2)LINQ to DataSet;
    • (3)LINQ to Entities;

LINQ所在命名空间

  • SyStem.Linq;该命名空间由系统自动引入。

使用和不使用LINQ查询的对比

  • 不使用LINQ

    #region 示例1:不使用LINQ查询
    int[] nums = { 1, 8, 2, 321, 82, 93, 288, 29 };
    List<int> list = new List<int>();
    foreach (int item in nums)
    {
        if (item %2 !=0)
        {
            list.Add(item);
        }
    }
    list.Sort();
    list.Reverse();
    foreach (int  item in list)
    {
        Console.WriteLine(item);
    }
    Console.ReadLine();
    #endregion
    
    • 使用LINQ查询

      #region 示例2:使用LINQ技术查询数组
      int[] nums = { 1, 8, 2, 321, 82, 93, 288, 29 };
      var list = from num in nums 
          where num % 2 != 0 
          orderby num descending
          select num;
      foreach (int item in list)
      {
          Console.WriteLine(item);
      }
      Console.ReadKey();
      #endregion
      

      LINQ查询简单、直观、明了。

    LINQ查询方法

    1. 获取数据:扩展方法Select()

      • Select()是一个泛型扩展方法,Select方法里面是一个Lambda表达式,返回结果是一个迭代器(Iterator
      • Select()方法使用的时候,要求传递一个委托实例(委托实例就是一个方法)

      Select()方法应用

      #region 示例3:Select()方法应用
      int[] nums = { 1, 8, 2, 321, 82, 93, 288, 29 };
      var list = nums.Select(item => item * item);
      foreach (int item in list)
      {
          Console.WriteLine(item);
      }
      Console.ReadKey();
      #endregion
      
    2. 筛选数据:Where()方法

      • Where()方法是一个泛型扩展方法
      • Where()方法使用的时候要求传递一个委托实列,但该实例是一个判断条件,因此返回的类型必需是bool类型

      Where()方法应用

      #region 示例4:Where()方法应用
      int[] nums = { 1, 8, 2, 321, 82, 93, 288, 29 };
      var list = nums.Where(item => item % 2 == 0).Select(i => i * i);
      foreach (int  item in list)
      {
          Console.WriteLine(item);
      }
      Console.ReadKey();
      #endregion
      
    3. 排序数据:OrderBy()方法

      • OrderBy()是一个扩展方法
      • OrderBy()里面的参数要求传递一个排序的字段,默认按照升序排列
      • 如果想降序排列可以使用OrderByDescending方法

      OrderBy()方法应用

      #region 示例5:OrderBy()方法应用
      int[] nums = { 1, 8, 2, 321, 82, 93, 288, 29 };
      var list = nums
          .Where(item => item % 2 == 0)
          .Select(i => i * i)
          .OrderByDescending(item => item);
      foreach (var item in list)
      {
          Console.WriteLine(item);
      }
      Console.ReadKey();
      #endregion
      

      字符串数组排序:

      #region 示例6:字符串排序
      string[] nums = { "张三", "李四", "王五器", "陈六", "钱七", "赵八" };
      var list = nums
          .Where(item => item.Length == 2)
          .Select(item => item)
          .OrderBy(item => item.Substring(0, 1));
      foreach (var item in list)
      {
          Console.WriteLine(item);
      }
      Console.ReadLine();
      #endregion
      
    4. 分组数据:GroupBy()方法

      • OrderBy()是一个扩展方法
      • OrderBy()里面的参数要求从传递一个分组的字段

      GroupBy()方法应用

      #region 示例7: GroupBy()方法应用
      string[] nums = { "张三", "李四", "王五器", "陈六", "钱七", "赵八" };
      var list = nums
            .Where(item => item.Length == 2)
            .Select(item => item)
            .GroupBy(item => item.Substring(0, 1));
      foreach (var groupitem in list)
      {
          Console.WriteLine("---------------");
          Console.WriteLine("分组字段:{0}", groupitem.Key);
          foreach (var item in groupitem) // 内层循环遍历分组项
          {
               Console.WriteLine(item);
          }
      }
      Console.ReadLine();
      # endregion
      
上一篇:LINQ查询子句


下一篇:prometheus监控docker容器相关资源