C#语法之Linq查询基础二

上篇C#语法之Linq查询基础一基本把Linq介绍了一下,这篇主要是列举下它的几个常见用法。

在用之前先准备些数据,新建了两个类Student、Score,并通过静态方法提供数据。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqDemo
{
    public class Student
    {
        public string StuId { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }

        public Student(string stuId, string name,int age)
        {
            StuId = stuId;
            Name = name;
            Age = age;
        }

        public static List<Student> GetAllStudents()
        {
            List<Student> stus = new List<Student>() {
                new Student("001","xiaoming1",25),
                new Student("002","xiaoming2",24),
                new Student("003","xiaoming3",23),
                new Student("004","xiaoming4",26),
                new Student("005","xiaoming5",27),
                new Student("006","xiaoming1",25)
            };
            return stus;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqDemo
{
    public class Score
    {
        public string StuId { get; set; }

        public int Math { get; set; }

        public int English { get; set; }

        public int Chinese { get; set; }

        public Score(string stuId, int math, int english, int chinese)
        {
            StuId = stuId;
            Math = math;
            English = english;
            Chinese = chinese;
        }

        public  static List<Score> GetAllScores()
        {
            List<Score> scores = new List<Score>()
            {
                new Score("001",85,90,85),
                new Score("002",85,90,85),
                new Score("003",60,70,65),
                new Score("004",59,99,75),
                new Score("005",66,90,65)
            };
            return scores;
        }

    }
}

一、筛选

where 是筛选lamdba表达式的,OfType<TResult>是筛选TResult类型的

            int[] a = new int[] { 1, 3, 4, 6, 8, 7, 9, 1, 3, 2 };
            var stus = Student.GetAllStudents().Where(p => p.StuId.Equals("001"));
            foreach (Student stu in stus)
            {
                Console.WriteLine("StuId:{0} Name:{1}", stu.StuId, stu.Name);
            }

            var result = a.Where((r, index) => r % 2 == 0 && index % 2 == 1);
            foreach (var s in result)
            {
                Console.WriteLine("{0}", s);
            }
            Console.WriteLine("--------------------------");
            object[] data = { "one", 2, 3, "four", 5 };
            //OfType 可隐式转换 sting可隐式转换为int int不可隐式转换为string 所以不能直接写OfType<string>()
            result = data.OfType<int>();
            foreach (var s in result)
            {
                Console.WriteLine("{0}", s);
            }

二、改变元素顺序

Orderby thenby来进行排序,thenby可以使用多次来多条件排序

            //单个排序
            int[] a = new int[] { 1, 3, 4, 6, 8, 7, 9, 1, 3, 2 };
            var result = a.OrderByDescending(p => p);
            foreach (var s in result)
            {
                Console.WriteLine("{0}", s);
            }

            //多条件排序
            var result = Student.GetAllStudents().OrderByDescending(p => p.StuId).ThenBy(p => p.Name);

            foreach (var s in result)
            {
                Console.WriteLine("StuId:{0} Name:{1}", s.StuId, s.Name);
            }

翻转

对于上面的查询后面加一个Reverse()方法则会将结果翻转。

            var result = Student.GetAllStudents().OrderByDescending(p => p.StuId).ThenBy(p => p.Name).Reverse();

            foreach (var s in result)
            {
                Console.WriteLine("StuId:{0} Name:{1}", s.StuId, s.Name);
            }

三、分组

分组常用作统计或查找重复。下面的例子就是查找姓名和年龄都相同的学生。

            var result = from stu in Student.GetAllStudents()
                         group stu by new { stu.Name, stu.Age } into g
                         where g.Count() > 1
                         select new
                         {
                             g.Key.Name,
                             g.Key.Age
                         };

            foreach (var s in result)
            {
                Console.WriteLine("Name:{0} Age:{1}", s.Name, s.Age);
            }

四、连接

左连接

            var result = from stu in Student.GetAllStudents()
                         join s in Score.GetAllScores() on stu.StuId equals s.StuId into joinStuScore
                         from p in joinStuScore.DefaultIfEmpty()
                         select new
                         {
                             StuId = stu.StuId,
                             Name = stu.Name,
                             Math = p == null ? 0 : p.Math,
                             English = p == null ? 0 : p.English,
                             Chinese = p == null ? 0 : p.Chinese

                         };
            foreach (var s in result)
            {
                Console.WriteLine("StuId:{0} Name:{1} Math:{2} English:{3} Chinese:{4}", s.StuId, s.Name, s.Math, s.English, s.Chinese);
            }

内连接

            var result = from stu in Student.GetAllStudents()
                         join s in Score.GetAllScores() on stu.StuId equals s.StuId

                         select new
                         {
                             StuId = stu.StuId,
                             Name = stu.Name,
                             Math = s.Math,
                             English = s.English,
                             Chinese = s.Chinese

                         };
            foreach (var s in result)
            {
                Console.WriteLine("StuId:{0} Name:{1} Math:{2} English:{3} Chinese:{4}", s.StuId, s.Name, s.Math, s.English, s.Chinese);
            }

五、集合操作

下面是两个集合的交集、差集和并集,至于distinct这个之前有专门讲解。

            int[] a = {1,3,5,2 };
            int[] b = { 1,2,6,7};
            var result = a.Intersect(b);
            foreach (var r in result)
            {
                Console.WriteLine(r);
            }
            Console.WriteLine("---------------");
            result=a.Except(b);
            foreach (var r in result)
            {
                Console.WriteLine(r);
            }
            Console.WriteLine("---------------");
            result = a.Union(b);
            foreach (var r in result)
            {
                Console.WriteLine(r);
            }

六、分区

Take()和Skip()常用来做分页操作。下面的demo演示分页。

            int pageSize = 5;
            int pageCount = (int)Math.Ceiling(Student.GetAllStudents().Count()/(double)pageSize);
            for (int pageIndex = 0; pageIndex < pageCount; pageIndex++)
            {
                Console.WriteLine("page {0}",pageIndex);
                var result = (from s in Student.GetAllStudents().OrderBy(p => p.Age) select s).Skip(pageIndex * pageSize).Take(pageSize);

                foreach (var s in result)
                {
                    Console.WriteLine("StuId:{0} Name:{1} Age:{2}", s.StuId, s.Name,s.Age);
                }
            }

七、限定符操作符

Any、All、Contains都是限定符操作符。Any是否有一个满足条件。ALL是所有元素都满足条件。Contains检查某个元素是否在集合中。都是返回布尔值。

            bool anyFlag = Student.GetAllStudents().Any(p=>p.Name.Equals("xiaoming1") &&p.Age==25);
            bool allFlag = Student.GetAllStudents().Any(p =>p.Age == 25);
            Student s = new Student("001","xiaoming",25);
            bool containsFlag = Student.GetAllStudents().Contains(s);
            Console.WriteLine("Any:{0} All:{1} Contains:{2}",anyFlag,allFlag,containsFlag);

八、聚合函数

Linq还提供了Count()、Sum()、Min()、Max()、Average()、Aggregate()一系列聚合函数。

时间: 2024-10-05 23:27:14

C#语法之Linq查询基础二的相关文章

C#语法之Linq查询基础一

Linq做.Net开发的应该都用过,有些地方很复杂的逻辑用Linq很方便的解决.对于Linq to object.Linq to xml.Linq to sql.Linq to Entity(EF)都可以使用linq查询.不知道大家有没有想过为什么linq对这些都可以使用呢?统一的api适用这么多.其实主要还是IEnummerable<T>和IQueryable<T>两个接口.可能有人会问为什么是两个接口?这两个接口有什么区别或者联系呢?这又要引出来Enummerable.Quer

LINQ查询基础

一.什么是LINQ LINQ是Language Integrate Query的缩写,意为语言集成查询,是微软在.Net Framework 4.5版中推出的主要特性之一. 它为开发人员提供了统一的数据查询模式,并与.Net开发语言(如C#和VB.Net)集成,很大程度上简化了数据查询的编码和调试工作,提供了数据查询的性能. LINQ中查询表达式访问的是一个对象,而该对象可以表示为各种类型的数据源.比如SQL Server数据库,XML文档,ADO.NET数据集,以及内存中的数据集合等. 在.N

LINQ查询语法

一.LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询语法(Query Expression) 1.方法语法:本质是通过扩展方法和Lambda表达式来创建查询 3.查询语法:查询比较类似于SQL查询 关系:.NET公共语言运行库(CLR)并不具有查询语法的概念.所以,编译器会在程序编译时把查询表达式转换为方法语法,即对扩展方法的调用.所以使用方法语法会让我们更加接近和了解LINQ的实现和本质,并且一些查询只能表示为方法调用,如检索序列中的最大值.最小值元素的查询,他们

linq查询语法和方法

1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataContext db=new NorthwindDataContext()) { //linq查询语法(基本语法) var query = from e in db.Employees where e.FirstName.StartsWith("M") select e; //linq方法语法(基本方法) v

LINQ基础(二)

本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类. 下面的例子需要用到LINQ基础(一)(http://www.cnblogs.com/afei-24/p/6841361.html)的一些代码 1.筛选 LINQ查询使用where子句添加条件表达式来筛选,where子句可以合并多个表达式. var racers = from r in Formula1.GetChampions() where r.Wins>15 &

LINQ:开始使用 LINQ(二)- 基本 LINQ 查询操作

开始使用 LINQ (二)- 基本 LINQ 查询操作 一.获取数据源:from 在 LINQ 查询中,第一步是指定数据源.像在大多数编程语言中一样,在 C# 中,必须先声明变量,才能使用它.在 LINQ 查询中,最先使用 from 子句的目的是引入数据源 (customers) 和范围变量 (cust). 1 //queryAllCustomers 是 IEnumerable<Cutsomer> 类型 2 var queryAllCustomers = from cust in custom

C#基础:LINQ 查询函数整理

1.LINQ 函数 1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作上处处可见,Where()的主要任务是负责过滤集合中的数据:其原型如下: 1 public static IEnumerbale<TSouce> Where<TSource>(this IEnumerable<Tsource> source,Func<TSource,bo

Object Pascal 语法之语言基础(二)

1.5 数据类型与定义变量 Object Pascal 语言的最大特点是对数据类型的要求非常严谨.传递给过程或函数的参数值必须与形参的类型一致.在Object Pascal 语言中不会看到像C 语言编译器提示的“可疑的指针转换”等警告信息.由于Object Pascal 语言对数据类型比较严谨,因此它会对代码进行严格检查,以确保不会出现错误.变量是程序代码中代表一个内存地址的标识符,那么该地址的内存内容就可以在程序代码执行时被改变.每个变量都有一个名字和数据类型,名字可以用来引用变量,数据类型决

NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)

摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NHibernate重写之前所有的查询. 本篇文章的代码可以到NHibernate查询下载 1.创建IQueryable对象,返回所有Customer对象信息 1 public IList<Customer> QueryAllLinq() 2 { 3 return Session.Query<C