.NETCoreCSharp 中级篇2-3

本节内容为Linq及其拓展方法、Linq中表达式树的使用

简介

语言集成查询(LINQ)是一系列直接将查询功能集成到C#语言的技术统称。数据查询历来都表示为简单的字符串,没有编译时类型检查或IntelliSense支持。此外,需要针对每种类型的数据源了解不同的查询语言:SQL数据库、XML文档、各种Web服务等。借助LINQ,查询成为了最高级的语言构造,就像类、方法和事件一样。可以使用语言关键字和熟悉的运算符针对强类型化对象集合编写查询。LINQ系列技术提供了针对对象(LINQtoObjects)、关系数据库(LINQtoSQL)和XML(LINQtoXML)的一致查询体验。

对于编写查询的开发者来说,LINQ最明显的“语言集成”部分就是查询表达式。查询表达式采用声明性查询语法编写而成。使用查询语法,可以用最少的代码对数据源执行筛选、排序和分组操作。可使用相同的基本查询表达式模式来查询和转换SQL数据库、ADO.NET数据集、XML文档和流以及.NET集合中的数据。

在C#中可为以下对象编写LINQ查询:SQLServer数据库、XML文档、ADO.NET数据集以及支持IEnumerable或泛型IEnumerable接口的任何对象集合。此外,第三方也为许多Web服务和其他数据库实现提供了LINQ支持。

Linq基本关键字介绍

  • from ...in:与foreach循环类似,将一个实现了IEnumerable接口的数据进行迭代,通常是from 迭代变量 in 数据源的方式;
  • select:将数据选中返回集合(IEnumerable类型)
  • where:后面接上相关限制语句,例如where a<3,如果直接返回,则会是一个IQueryable数据。
  • orderby,ThenBy:排序规则,后面接上排序的依据,例如orderby A.Id ThenBy A.Name
  • GroupBy:分组依据,返回值回是一个类似于Dictionary的数据(IGouping)
  • join:联接操作在不同序列间创建关联,这些序列在数据源中未被显式模块化。例如,可通过执行联接来查找所有位置相同的客户和分销商。在 LINQ 中,join 子句始终作用于对象集合,而非直接作用于数据库表。

    通常来说这几种是最为常用的Linq关键字,还有一些关于Linq查询的方法将在后面拓展方法中进行讲解

Linq基本操作

对于Linq操作,其实非常类似于我们的SQL语句操作,在以前EF并不完善的时候,Linq To Sql是一种非常好用的数据库操作语句。当然,Linq也可以用于IEnumerable及其派生类型的操作。

我们在这实际的进行一次类似于数据库操作的Linq练习,案例是这样的,学生选课系统,那么存在学生与课程的关系,一个学生可以选多门课程,一个课程也可以有多个学生,对于这种关系,我们在代码中难以操作,因此引入中间表SC,记录学生的选课记录。假定我们不使用类似于EF中的集合去记录,只是单纯的使用代码将一切连接起来。

代码如下:

    class Student
{
public Student(int id,string name)
{
StudentId = id;
Name = name;
}
public int StudentId { get; set; }
public string Name { get; set; }
}
class Course
{
public int CourseId { get; set; }
public string CName { get; set; }
public Course(int sid,string name)
{
CourseId = sid;
CName = name;
}
}
class SC
{
public int CourseId { get; set; }
public int StudentId { get; set; }
public SC(int cid,int sid)
{
CourseId = cid;
StudentId = sid;
}
}
class Program
{
static void Main(string[] args)
{
List<Student> students = new List<Student>()
{
new Student(1,"Mike"),
new Student(2,"Jack"),
new Student(3,"David")
};
List<Course> courses = new List<Course>()
{
new Course(1,"CSE"),
new Course(2,"CN"),
new Course(3,"SWE")
};
List<SC> sCs = new List<SC>()
{
new SC(1,1),
new SC(1,2),
new SC(1,3),
new SC(2,3),
new SC(3,2)
};
//筛选名称
var temp = from stu in students
where stu.Name == "Jack"
select stu;
//级联多重查询,查询所有学生选课信息
var temp1 = from stu in students
join scs in sCs on stu.StudentId equals scs.StudentId
join c in courses on scs.CourseId equals c.CourseId
select new {stu.Name,c.CName};
foreach(var t in temp1)
{
Console.WriteLine("Name:{0},Course:{1}",t.Name,t.CName);
}
}
}

Lambda表达式简要介绍

Lambda表达式是一种看起来高大上的一种东西,本身我是想与委托一起进行讲解的,但是目前所接除到了我们的Linq拓展方法,里面会涉及一些有关Lambda表达式的操作,尤其是Lambda表达式构造表达式树。

Lambda表达式其实非常的简单,他是一种常见的语法糖,你可以将Lambda表达式称为匿名函数,不过在Linq中,他们常用作一种名为匿名委托的方式。我在本节中不会很详细的进行讲解我们的Lambda表达式,只会告诉你如何在Linq中使用。

在Linq中,Lambda表达式通常长这个样子

p => p.Id == id && p.Age > 5;

=>这个符号,就是lambda表达式的精髓,这个符号之前的p,是函数的返回值,当然也可能是没有的,不过在Linq中,都是有的,因为我们需要一个匿名委托构造表达式树。而后面的所有,则是这个匿名函数的方法体。通常来说,Linq中lambda表达式的方法体都会是一个类似于where判断型的语句,返回值通常是一个bool类型。

Linq拓展方法

有了前面lambda表达式的一个简单的概念,我们就可以讲解一下Linq中的拓展方法了,拓展方法提供了许多你使用Linq关键字无法实现的操作。

常见的拓展方法有以下几种:

  • Where()
  • FirstOrDefault()
  • Join()
  • GroupBy()
  • OrderBy()
  • Max/Min()

单从单词意思就能理解这些操作,我们使用的时候只需要使用类似p=>p.id即可。

例如:

students.Where(p=>p.Name == "Jack").OrderBy(p=>p.StudentId).FirstOrDefault();

如果我的文章帮助了您,请您在github.NETCoreGuide项目帮我点一个star,在博客园中点一个关注和推荐。

Github

BiliBili主页

WarrenRyan'sBlog

博客园

.NETCoreCSharp 中级篇2-3 Linq简介的更多相关文章

  1. .NETCore C# 中级篇2-4 一文带你完全弄懂正则表达式

    .NETCoreCSharp 中级篇2-4 本节内容为正则表达式的使用 简介 有的时候,你是否有过这种需求:判断一个Ip地址.邮箱.密码规则是否合法.如果让你使用if一类的传统方法进行处理,你肯定会被 ...

  2. .NETCore C# 中级篇2-6 Json与XML

    .NETCoreCSharp 中级篇2-6 本节内容为Json和XML操作 简介 Json和XML文本是计算机网络通信中常见的文本格式,其中Json其实就是JavaScript中的数组与对象,体现了一 ...

  3. 零基础学习openstack【完整中级篇】及openstack资源汇总

    1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事 ...

  4. Spark学习体系整理(基础篇、中级篇、高级篇所涉及内容)

    新手刚开始学习比较迷茫,参考下面,然后找相关资料学习 1 Spark基础篇      1.1 Spark生态和安装部署          在安装过程中,理解其基本操作步骤.          安装部署 ...

  5. Farseer.net轻量级开源框架 中级篇:探究ORM(Mapping)

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: SQL执行报告 下一篇:Farseer.net轻量级开源框架 中级篇: Cooki ...

  6. Farseer.net轻量级开源框架 中级篇:事务的使用

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: Where条件的终极使用 下一篇:Farseer.net轻量级开源框架 中级篇: ...

  7. .NET Core CSharp 中级篇 2-1 装箱与拆箱

    .NET Core CSharp 中级篇 2-1 本节内容为装箱与拆箱 简介 装箱和拆箱是一个相对抽象的概念.你可以想象一下一堆满载货物的大卡车,他是由许多工人将货物集中堆放装入的,对于我们而言在没有 ...

  8. .NET Core CSharp 中级篇 2-2 List,ArrayList和Dictionary

    .NET Core CSharp 中级篇 2-2 本节内容为List,ArrayList,和Dictionary 简介 在此前的文章中我们学习了数组的使用,但是数组有一个很大的问题就是存储空间不足,我 ...

  9. .NET Core CSharp 中级篇2-8 特性标签

    .NET Core CSharp 中级篇2-8 本节内容为特性标签 简介 标签Attribute是一个非常重要的技术,你可以使用Attribute技术优化精简你的代码.特性标签可以运用在程序集,模块, ...

随机推荐

  1. DBA主宰一切请求,MySQL 查询重写

    这个功能一年左右之前就以知晓,应该是5.7的高版本中.今天难得有兴致测试.随之也就总结一下. 前言: 一般来说,我们都会让开发自己去改sql.这样需要重启应用,单节点不可避免有或多或少的停服时间.同事 ...

  2. HDU 2298:Toxophily(推公式)

    http://acm.hdu.edu.cn/showproblem.php?pid=2298 题意:给出一个x,y,v,问从(0,0)以v为初速度射箭,能否射到(x,y)这个点,如果能,输出最小的射出 ...

  3. 使用JavaScript实现量化策略并发执行——封装Go函数

    在实现量化策略时,很多情况下,并发执行可以降低延时提升效率.以对冲机器人为例,需要获取两个币的深度,顺序执行的代码如下: 请求一次rest API存在延时,假设是100ms,那么两次获取深度的时间实际 ...

  4. redis 文件事件模型

    参考文献: 深入剖析 redis 事件驱动 Redis 中的事件循环 深入了解epoll (转) Redis自己的事件模型 ae EPOLL(7) Linux IO模式及 select.poll.ep ...

  5. DRF 版本、认证、权限、限制、解析器和渲染器

    目录 一.DRF之版本控制 为什么要有版本控制? DRF提供的版本控制方案 版本的使用 全局配置 局部配置(使用较少) 二.DRF之认证 内置的认证 步骤 三.DRF之权限 1.自定义一个权限类 2. ...

  6. 嵊州D1T2 圣女

    嵊州D1T2 圣女 马格里多希望为自己死去却身体不腐的女儿申请圣女. 只是,他不知道神圣的基督教和教皇已经腐朽到了何种地步! 22 年来,他辗转教皇国的各个教堂,但各个教堂都只会以各种理由搪塞.推辞. ...

  7. 2019-2020年值得关注的9个AR发展趋势

    作者Andrew Makarov,由计算机视觉life编辑:乔媛媛编译 更好的阅读体验请看首发原文链接 2019-2020年值得关注的9个AR发展趋势 增强现实技术在2019年实现了创纪录的发展.微软 ...

  8. 3. Django每日一码 之 Serializers 源码

    2019-7-6 今日源码:rest-framework 序列化Serializers 序列化组件Serializers 源码分析 首先,它需要 data .many . instance,其中 in ...

  9. Java web导出word,文件名为中文,%E6%9D%90%E8%B4%A8%E5%8D%95乱码

    因为文件名为中文,导出时会有乱码问题 原代码: String fileName = "文件名.doc"; response.setHeader("Content-Disp ...

  10. web应用分页

    1. 场景描述 目前大部分的应用程序中都会用到分页功能,以便减少前端浏览器及后台服务器的压力,以及其他方面的考虑. (1)分页从概念上可分为逻辑分页和物理分页,逻辑分页主要是通过应用程序(前端或者后端 ...