linq查询简介

 

第二章 LinQ查询简介

什么是LINQ:

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

LINQ 是一组语言特性和API,使得你可以使用统一的方式编写各种查询。查询的对象包括XML、对象集合、SQL Server 数据库、MySql数据库、Oracle数据库等等。

LINQ 主要包含以下三部分:

LINQ to Objects 主要负责对象的查询

LINQ to XML 主要负责 XML 的查询

LINQ to ADO.NET 主要负责数据库的查询

LINQ to SQL

LINQ to DataSet

LINQ to Entities

LINQ的基本查询:

所有LinQ查询操作都包括以下三个不同的操作:

1.创建数据源:这里的数据源可以是数组,集合,XML,SQL等数据库
2.新建一个查询:
语法: from xxxx in xxxxx where xxx select;这一种结构,注意的是,必须以from开头,select结尾

3.执行查询:在这里我们通常用到执行查询就是foreach来做,当然有for语句也可以,但后者在效率上没有前者好

eg1:

            //1.创建数据源

            int[] arr = new int[] { 2, 4, 5, 6, 7, 9 };

            //2.创建查询

            var query = from num in arr

                        where num % 2 == 0

                        select num;

            //3.执行查询

            foreach (var num in query)

            {

                Console.WriteLine(num);

            }

该实例是用来从一个数组中查询出所有的偶数,三个步骤的执行顺序如图所示:

LinQ学习笔记

 

创建查询和执行查询是完全不同的两个过程,在创建查询时,query变量中没有任何值,相当于只是创建,并没检索任何数据,只有在执行查询时才根据创建的查询从数据源中检索数据,也就是说只有在用foreach循环遍历时才检索数据,这种执行过程叫延迟执行,我们也可以强制立即执行,方法如下:

1.执行聚合函数(Count、Max、Average、First)

2.调用ToList(TSource>)或ToArray(TSource>)

LINQ语法:

LinQ中的查询基本语法是:from 范围变量 in 数据源 where 条件 select 返回值,查询语句必须以from开头,以select结束,后面我们还会讲以group结束的。下面根据eg1一一介绍三个关键字的作用。

eg1:

            //1.创建数据源

            int[] arr = new int[] { 2, 4, 5, 6, 7, 9 };

            //2.创建查询

            var query = from num in arr

                        where num % 2 == 0

                        select num;

            //3.执行查询

            foreach (var num in query)

            {

                Console.WriteLine(num);

            }

 

1.from:from后面的num表示范围变量,类似说foreach中的迭代变量,但在该查询中是不发生迭代的(因为延迟查询),只有在执行查询时num将用作对arr数据源中每一个元素的引用。arr是我们创建的数据源,要求数据源必须实现IEnumerable、IEnumerable<T>或一个派生类型Iqueryable<T>中的任何一个接口,才能使用linq语句进行查询。

复合from子句的使用:

1)在某些情况下,源序列中的每个元素本身可能是序列,也可能包含序列

2)用于访问单个数据源中的内部集合

3)使用多个from子句执行联接查询(join)

eg2:

            //数据源创建一个学生对象集合,每个学生对象包含两个属性

            //LastName:姓名 scores:分数 其中分数本身也是一个集合类型
            List<Student> students = new List<Student>
            {
                new Student{LastName="aa",Scores=new List<int>{67,87,99}},
                new Student{LastName="ff",Scores=new List<int>{66,86,95}},
                new Student{LastName="cc",Scores=new List<int>{64,56,99}},
                new Student{LastName="dd",Scores=new List<int>{47,44,87}},
                new Student{LastName="gg",Scores=new List<int>{67,77,88}}
            };

            //查询成绩大于80分的学员姓名和成绩
            var scoreQuery = from stu in students
                             from score in stu.Scores
                             where score > 80
                             select new { last = stu.LastName, score };
            foreach (var item in scoreQuery)
            {
                Console.WriteLine("姓名:" + item.last + "\t成绩:" + item.score);
            }

该实例用到了复合from子句,因为在学生集合中又包含一个成绩集合,最后返回的是学生的姓名和成绩,后面的new { last = stu.LastName, score }是一个匿名类,将要获取的数据重新构建成一个类,要显示的属性做为该匿名类中新的属性。

查询结果如图所示:

LinQ学习笔记

 

2.where:用来指定查询的条件,与sql中类似,但语法采用C#语法。where子句不能位于查询语句的第一句和最后一句,一个查询表达式中可以包含多个where子句,一个where子句中也可以包含多个条件,多个条件之间用C#语法中的逻辑运算符连接(&&、||、!),还可以放在group子句之前或之后,主要取决于是对源数据的筛选还是对分组后的筛选,若是对源数据的筛选,则放到group之前,若是对分组后的数据的筛选则放到group之后。where子句在程序编译时将被转换成标准的Where方法被调用。

3.select:返回查询结果。

除了以上三个关键字的使用,我们还要介绍两个:orderby子句和group子句。

4.orderby:排序子句,返回升序或降序的序列。与sql语句中的排序一样,可以指定按多列进行排序,默认情况下为升序,编译时也是将orderby子句转换成OrderBy方法的调用。

eg3:

//查询成绩大于80分的学员姓名和成绩,并按成绩降序排列
            var scoreQuery = from stu in students
                             from score in stu.Scores
                             where score > 80

                             orderby score descending
                             select new { last = stu.LastName, score };

注意:升序:ascending  降序:descending

 

5.group:分组查询,放回一个IGrouping(TKey,Telement)对象序列。编译时转换成GroupBy方法的调用。

eg4:

            //定义一个水果字符串数组

            string[] fruit = { "apple","pire","banana","peach","glood","orange"};

            //按水果单词的第一个字母分组
            var firstGroup = from f in fruit
                             group f by f[0];
            //item代表IGrouping中的一个元素
            foreach (var item in firstGroup)
            {
                //item.key代表被分组的建
                Console.WriteLine(item.Key);
                //w代表每一个代表水果的单词
                foreach (var w in item)
                {
                    Console.WriteLine(w);
                }
                Console.WriteLine();
            }

eg5:

            //分组后的数据只要以元音字母开头的组
            //若要对分组后的数据再次进行筛选,需要将分组后的数据into成一个中间变量,后面再给中间变量做操作
            var secondGroup = from f in fruit
                              group f by f[0] into g
                              where g.Key == 'a' || g.Key == 'e' || g.Key == 'i' || g.Key== 'o' ||
                              g.Key == 'u'
                              select g;


            foreach (var item in secondGroup)
            {
                Console.WriteLine(item.Key);
                foreach (var i in item)
                {
                    Console.WriteLine(i);
                }
                Console.WriteLine();
            }

 

联接查询:

使用join子句进行联接查询,要求每个不同的数据源要有一个共享某个可以进行比较以判断是否相等的值,且join子句使用特殊的equals关键字比较是否相等,不能用> < >= <=等符号,只支持对等比较联接。

联接分为:

1)内联接

eg6:

var innerjoinQuery=from category in categories

                   join prod in products on

                   category.ID equals prod.categoryID

                   select new{productName=prod.Name,category=category.Name};

         

2)分组联接 

eg7:

var innerGroupQuery=from category in categories

                   join prod in products on

                   category.ID equals prod.categoryID into prodGroup

                   select new{categoryName=category.Name,products=prodGroup};

         

3)左外联接

 

 

摘录网站:http://blog.sina.com.cn/s/blog_4da1f0900100mfgp.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值