21.4 LINQ查询操作

  前面介绍了LINQ的一些基本的语法,以及LINQ常用的查询子句进行数据的访问和整合,甚至建立数据源对象和数据源对象之间的关联,使用LINQ查询子句能够实现不同的功能,包括投影、排序和聚合等,本节开始介绍LINQ的查询操作。

21.4.1 LINQ查询概述
  LINQ不仅提供了强大的查询表达式为开发人员对数据源进行查询和筛选操作提供遍历,LINQ还提供了大量的查询操作,这些操作通过实现IEnumerable<T>或IQueryable<T>提供的接口实现了投影、排序、聚合等操作。通过使用LINQ提供的查询方法,能够快速的实现投影、排序等操作。
  由于LINQ查询操作实现了IEnumerable<T>或IQueryable<T>接口,所以LINQ查询操作能够通过接口中特定的方法进行查询和筛选,可以直接使用数据源对象变量的方法进行操作。在LINQ查询操作的方法中,需要大量的使用Lambda表达式实现委托,这就从另一个方面说明了Lambda表达式的重要性。示例代码如下所示。

+展开
-C#
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
var lint = inter.Select(i => i);//使用Lambda

  上述代码使用了Select方法进行投影操作,在投影操作的参数中使用Lambda表达式表示了如何实现数据筛选。LINQ查询操作不仅包括Select投影操作,还包括排序、聚合等操作,LINQ常用操作如下所示。
1)Count:计算集合中元素的数量,或者计算满足条件的集合的元素的数量。
2)GroupBy:实现对集合中的元素进行分组的操作。
3)Max:获取集合中元素的最大值。
4)Min:获取集合中元素的最小值。
5)Select:执行投影操作。
6)SelectMany:执行投影操作,可以为多个数据源进行投影操作。
7)Where:执行筛选操作。
  LINQ不只提供上述这些常用的查询操作方法,还提供更多的查询方法,由于本书篇幅有限,只讲解一些常用的查询方法。

21.4.2 投影操作
  投影操作和SQL查询语句中的SELECT基本类似,投影操作能够指定数据源并选择相应的数据源,在LINQ中常用的投影操作包括Select和SelectMany。
1.Select选择子句
  Select操作能够将集合中的元素投影到新的集合中去,并能够指定元素的类型和表现形式,示例代码如下所示。

+展开
-C#
        static void Main(string[] args)
        {
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
            var lint = inter.Select(i => i);//Select操作
            foreach (var m in lint)//遍历集合
            {
                Console.WriteLine(m.ToString());//输出对象
            }
            Console.ReadKey();
        }

  上述代码将数据源进行了投影操作,使用Select进行投影操作非常简单,其作用同SQL语句中的SELECT语句十分相似,上述代码将集合中的元素进行投影并将符合条件的元素投影到新的集合中lint去。
2.SelectMany多重选择子句
  SelectMany和Select的用法基本相同,但是SelectMany与Select相比可以选择多个序列进行投影,示例代码如下所示。

+展开
-C#
        static void Main(string[] args)
        {
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
            int[] inter2 = { 21, 22, 23, 24, 25, 26};//创建数组
            List<int[]> list = new List<int[]>();//创建List
            list.Add(inter);//添加对象
            list.Add(inter2);//添加对象
            var lint = list.SelectMany(i => i);//SelectMany操作
            foreach (var m in lint)//遍历集合
            {
                Console.WriteLine(m.ToString());//输出对象
            }
            Console.ReadKey();
        }

  上述代码通过SelectMany方法将不同的数据源投影到一个新的集合中,运行结果如图21-17所示。
SelectMany投影操作
图21-17 SelectMany投影操作

21.4.3 筛选操作
  筛选操作使用的是Where方法,其使用方法同LINQ查询语句中的where子句使用方法基本相同,筛选操作用于筛选符合特定逻辑规范的集合的元素,示例代码如下所示。

+展开
-C#
       public static void WhereQuery()
        {
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
            var lint = inter.Where(i => i > 5);//使用where进行筛选操作
            foreach (var m in lint)//遍历集合
            {
                Console.WriteLine(m.ToString());//输出对象
            }
            Console.ReadKey();
        }

  上述代码通过Where方法和Lambda表达式实现了对数据源中数据的筛选操作,其中Lambda表达式筛选了现有集合中所有值大于5的元素并填充到新的集合中,使用LINQ查询语句的子查询语句同样能够实现这样的功能,示例代码如下所示。

+展开
-C#
var lint = from i in inter where i > 5 select i;//执行筛选操作

  上述代码同样实现了LINQ中的筛选操作Where,但是使用筛选操作的代码更加简洁,上述代码运行后如图21-18所示。
筛选操作
图21-18 筛选操作

21.4.4 排序操作
  排序操作最常使用的是OrderBy方法,其使用方法同LINQ查询子句中的orderby子句基本类似,使用OrderBy方法能够对集合中的元素进行排序,同样OrderBy方法能够针对多个参数进行排序。排序操作不仅提供了OrderBy方法,还提供了其他的方法进行高级排序,这些方法包括:
1)OrderBy方法:根据关键字对集合中的元素按升序排列。
2)OrderByDescending方法:根据关键字对集合中的元素按倒序排列。
3)ThenBy方法:根据次要关键字对序列中的元素按升序排列。
4)ThenByDescending方法:根据次要关键字对序列中的元素按倒序排列。
5)Reverse方法:将序列中的元素的顺序进行反转。
  使用LINQ提供的排序操作能够方便的进行排序,示例代码如下所示。

+展开
-C#
        public static void OrderByQuery()
        {
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
            var lint = inter.OrderByDescending(i => i);//使用倒序方法
            foreach (var m in lint)//遍历集合
            {
                Console.WriteLine(m.ToString());//输出对象
            }
            Console.ReadKey();
        }

  上述代码使用了OrderByDescending方法将数据源中的数据进行倒排,除此之外,还可以使用Reverse将集合内的元素进行反转,示例代码如下所示。

+展开
-C#
        public static void OrderByQuery()
        {
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
            var lint = inter.Reverse();//反转集合
            foreach (var m in lint)//遍历集合
            {
                Console.WriteLine(m.ToString());//输出对象
            }
            Console.ReadKey();
        }

  上述代码使用了Reverse元素将集合内的元素进行反转,运行结果如图21-19所示。
排序操作
图21-19 排序操作
  注意:排序和反转并不相同,排序是将集合中的元素进行排序,可以是正序也可以是倒序,而反转并没有进行排序,只是讲集合中的元素从第一个放到最后一个,依次反转而已。

21.4.5 聚合操作
  在SQL中,往往需要统计一些基本信息,例如今天有多少人留言,今天有多少人访问过网站,这些都可以通过SQL语句进行查询。在SQL查询语句中,支持一些能够进行基本运算的函数,这些函数包括Max、Min等。在LINQ中,同样包括这些函数,用来获取集合中的最大值和最小值等一些常用的统计信息,在LINQ中,这种操作被称为聚合操作。聚合操作常用的方法有:
1)Count方法:获取集合中元素的数量,或者获取满足条件的元素数量。
2)Sum方法:获取集合中元素的总和。
3)Max方法;获取集合中元素的最大值。
4)Min方法:获取集合中元素的最小值。
5)Average方法:获取集合中元素的平均值。
6)Aggregate方法:对集合中的元素进行自定义的聚合计算。
7)LongCount方法:获取集合中元素的数量,或者计算序列满足一定条件的元素的数量。一般计算大型集合中的元素的数量。
1.Max、Min、Count、Average内置方法
  通过LINQ提供的聚合操作的方法能够快速的获取统计信息,如要找到数据源中数据的最大值,可以使用Max方法,示例代码如下所示。

+展开
-C#
        public static void CountQuery()
        {
            int[] inter = { 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
            var Maxlint = inter.Max();//获取最大值
            var Minlint = inter.Min();//获取最小值
            Console.WriteLine("最大值是" + Maxlint.ToString());//输出最大值
            Console.WriteLine("最小值是" + Minlint.ToString());//输出最小值
            Console.ReadKey();
        }

  上述代码在获取最大值和最小值时并没有使用Lambda表达式,因为数据源中并没有复杂的对象,所以可以默认不使用Lambda表达式就能够返回相应的值,如果要编写Lambda表达式,可以编写相应代码如下所示。

+展开
-C#
            var Maxlint = inter.Max(i => i);//获取最大值
            var Minlint = inter.Min(i => i);//获取最小值

  聚合操作还能够获取平均值和获取集合中元素的数量,示例代码如下所示。

+展开
-C#
        public static void CountQuery2()
        {
            int[] inter = { 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
            var Countlint = inter.Count(i => i > 5);//获取元素数量
            var Arrlint = inter.Average(i => i);//获取平均值
            Console.WriteLine("复合条件的集合有" + Countlint.ToString()+"项");//输出项数
            Console.WriteLine("平均值为" + Arrlint.ToString());//输出平均值
            Console.ReadKey();
        }

  上述代码通过Count方法获得符合相应条件的元素的数量,并通过Average方法获取平均值,运行后如图21-20所示。
Count和Average方法
图21-20 Count和Average方法
  在编写查询操作时,可以通过编写条件来规范查询范围,例如上述代码使用Count的条件就编写了i=>i>5的Lambda表达式,该表达式会返回符合该条件的集合再进行方法运算。
2.Aggregate聚合方法
  Aggregate方法能够对集合中的元素进行自定义的聚合计算,开发人员能够使用Aggregate方法实现类似Sum、Count等聚合计算,示例代码如下所示。

+展开
-C#
        public static void AggregateQuery()
        {
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };//创建数组
            var aq = inter.Aggregate((x,y)=>x+y); //使用Aggregate方法
            Console.WriteLine(aq.ToString());//实现Sum方法
            Console.ReadKey();
        }

  上述代码通过编写Lambda表达式实现了数据源中所有数据的加法,也就是实现了Sum聚合方法,运行后如图21-21所示。
自定义聚合操作
图21-21 自定义聚合操作
  LINQ不仅仅包括这些查询操作方法,LINQ还包括集合操作,删除集合中重复的元素,也能够计算集合与集合之间的并集差集等。LINQ查询操作不仅提供了最基本的投影、筛选、聚合等操作,还能够极大的简化集合的开发,实现集合和集合中元素的操作。

评论(1)网络
阅读(63)喜欢(0)不喜欢(0)asp.net-linq