第21章  使用LINQ查询
了解了基本的LINQ基本概念,以及Lambda表达式基础后,就能够使用LINQ进行应用程序开发。LINQ使用了Lambda表达式,以及底层接口实现了对集合的访问和查询,开发人员能够使用LINQ对不同的对象,包括数据库、数据集和XML文档进行查询。
21.1  LINQ查询概述
LINQ可以对多种数据源和对象进行查询,如数据库、数据集、XML文档甚至是数组,这在传统的查询语句中是很难实现的。如果有一个集合类型的值需要进行查询,则必须使用Where等方法进行遍历,而使用LINQ可以仿真SQL语句的形式进行查询,极大的降低了难度。
21.1.1  准备数据源
既然LINQ可以查询多种数据源和对象,这些对象可能是数组,可能是数据集,也可能是数据库,那么在使用LINQ进行数据查询时首先需要准备数据源。
1.数组
数组中的数据可以被LINQ查询语句查询,这样就省去了复杂的数组遍历。数组数据源示例代码如下所示。
            string[] str = { "学习", "学习LINQ", "好好学习", "生活很美好" };
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
数组可以看成是一个集合,虽然数组没有集合的一些特性,但是从另一个角度上来说可以看成是一个集合。在传统的开发过程中,如果要筛选其中包含“学习”字段的某个字符串,则需要遍历整个数组。
2.SQL Server
在数据库操作中,同样可以使用LINQ进行数据库查询。LINQ以其优雅的语法和面向对象的思想能够方便的进行数据库操作,为了使用LINQ进行SQL Server数据库查询,可以创建两个表,这两个表的结构如下所示。Student(学生表):
S_ID:学生ID。
S_NAME:学生姓名。
S_CLASS:学生班级。
C_ID:所在班级的ID。
上述结构描述了一个学生表,可以使用SQL语句创建学生表,示例代码如下所示。
    USE [student]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
        CREATE TABLE [dbo].[Student](
            [S_ID] [int] IDENTITY(1,1) NOT NULL,
            [S_NAME] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
            [S_CLASS] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
            [C_ID] [int] NULL,
    CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED
    (
        [S_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
为了更加详细的描述一个学生所有的基本信息,就需要创建另一个表对该学生所在的班级进行描述,班级表结构如下所示。Class(班级表):
C_ID:班级ID。
C_GREAD:班级所在的年级。
C_INFOR:班级专业。
上述代码描述了一个班级的基本信息,同样可以使用SQL语句创建班级表,示例代码如下所示。
    USE [student]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
writeline输出数值变量
    CREATE TABLE [dbo].[Class](
            [C_ID] [int] IDENTITY(1,1) NOT NULL,
            [C_GREAD] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
            [C_INFOR] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    CONSTRAINT [PK_Class] PRIMARY KEY CLUSTERED
    (
            [C_ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
    ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
上述代码在Student数据库中创建了一个班级表,开发人员能够向数据库中添加相应的信息以准备数据源。
3.数据集
LINQ能够通过查询数据集进行数据的访问和整合;通过访问数据集,LINQ能够返回一个集合变量;通过遍历集合变量可以进行其中数据的访问和筛选。在第9章中讲到了数据集的概念,开发人员能够将数据库中的内容填充到数据集中,也可以自行创建数据集。
数据集是一个存在于内存的对象,该对象能够模拟数据库的一些基本功能,可以模拟小型的数据库系统,开发人员能够使用数据集对象在内存中创建表,以及模拟表与表之间的关系。在数据集的数据检索过程中,往往需要大量的if、else等判断才能检索相应的数据。
使用LINQ进行数据集中数据的整理和检索可以减少代码量并优化检索操作。数据集可以是
开发人员自己创建的数据集也可以是现有数据库填充的数据集,这里使用上述SQL Server创建的数据库中的数据进行数据集的填充。
21.1.2  使用LINQ
在传统对象查询中,往往需要很多的if、else语句进行数组或对象的遍历,例如在数组中寻相应的字段,实现起来往往比较复杂,而使用LINQ就简化了对象的查询。由于前面已经准备好了数据源,那么就能够分别使用LINQ语句进行数据源查询。
1.数组
在前面的章节中,已经创建了一个数组作为数据源,数组示例代码如下所示。
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
上述代码是一个数组数据源,如果开发人员需要从其中的元素中搜索大于5的数字,传统的方法应该遍历整个数组并判断该数字是否大于5,如果大于5则输出,否则不输出,示例代码如下所示。
using System;
using System.Collections.Generic;
using System.Linq;                                                //使用必要的命名空间
using System.Text;
namespace _21_1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] str = { "学习", "学习LINQ", "好好学习", "生活很美好" };    //定义数组
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
            for (int i = 0; i < inter.Length; i++)                            //遍历数组
            {
                if (inter[i] > 5)                                        //判断数组元素的值是否大于5
                {
                    Console.WriteLine(inter[i].ToString());                //输出对象
                }
            }
            Console.ReadKey();
        }
    }
}
上述代码非常简单,将数组从头开始遍历,遍历中将数组中的的值与5相比较,如果大于5就会输出该值,如果小于5就不会输出该值。虽然上述代码实现了功能的要求,但是这样编写的代码繁冗复杂,也不具有扩展性。如果使用LINQ查询语句进行查询就非常简单,示例代码如下所示。
    class Program
    {
        static void Main(string[] args)
        {
            string[] str = { "学习", "学习LINQ", "好好学习", "生活很美好" };    //定义数组
            int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };                        //定义数组
            var st = from s in inter where s > 5  select s;                //执行LINQ查询语句
            foreach (var t in st)                                    //遍历集合元素
            {
                Console.WriteLine(t.ToString());                        //输出数组
            }
            Console.ReadKey();
        }
    }
使用LINQ进行查询之后会返回一个IEnumerable的集合。在上一章讲过,IEnumerable是.NET框架中最基本的集合访问器,可以使用foreach语句遍历集合元素。使用LINQ查询数组更加容易被阅读,LINQ查询语句的结构和SQL语法十分类似,LINQ不仅能够查询数组,还可以通过.NET提供的编程语言进行筛选。例如str数组变量,如果要查询其中包含“学习”的字符串,对于传统的编程方法是非常冗余和繁琐的。由于LINQ是.NET编程语言
中的一部分,开发人员就能通过编程语言进行筛选,LINQ查询语句示例代码如下所示。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。