.NETCoreCSharp 中级篇2-3 Linq简介
.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,在博客园中点一个关注和推荐。
.NETCoreCSharp 中级篇2-3 Linq简介的更多相关文章
- .NETCore C# 中级篇2-4 一文带你完全弄懂正则表达式
.NETCoreCSharp 中级篇2-4 本节内容为正则表达式的使用 简介 有的时候,你是否有过这种需求:判断一个Ip地址.邮箱.密码规则是否合法.如果让你使用if一类的传统方法进行处理,你肯定会被 ...
- .NETCore C# 中级篇2-6 Json与XML
.NETCoreCSharp 中级篇2-6 本节内容为Json和XML操作 简介 Json和XML文本是计算机网络通信中常见的文本格式,其中Json其实就是JavaScript中的数组与对象,体现了一 ...
- 零基础学习openstack【完整中级篇】及openstack资源汇总
1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事 ...
- Spark学习体系整理(基础篇、中级篇、高级篇所涉及内容)
新手刚开始学习比较迷茫,参考下面,然后找相关资料学习 1 Spark基础篇 1.1 Spark生态和安装部署 在安装过程中,理解其基本操作步骤. 安装部署 ...
- Farseer.net轻量级开源框架 中级篇:探究ORM(Mapping)
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: SQL执行报告 下一篇:Farseer.net轻量级开源框架 中级篇: Cooki ...
- Farseer.net轻量级开源框架 中级篇:事务的使用
导航 目 录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: Where条件的终极使用 下一篇:Farseer.net轻量级开源框架 中级篇: ...
- .NET Core CSharp 中级篇 2-1 装箱与拆箱
.NET Core CSharp 中级篇 2-1 本节内容为装箱与拆箱 简介 装箱和拆箱是一个相对抽象的概念.你可以想象一下一堆满载货物的大卡车,他是由许多工人将货物集中堆放装入的,对于我们而言在没有 ...
- .NET Core CSharp 中级篇 2-2 List,ArrayList和Dictionary
.NET Core CSharp 中级篇 2-2 本节内容为List,ArrayList,和Dictionary 简介 在此前的文章中我们学习了数组的使用,但是数组有一个很大的问题就是存储空间不足,我 ...
- .NET Core CSharp 中级篇2-8 特性标签
.NET Core CSharp 中级篇2-8 本节内容为特性标签 简介 标签Attribute是一个非常重要的技术,你可以使用Attribute技术优化精简你的代码.特性标签可以运用在程序集,模块, ...
随机推荐
- WebGL 着色器偏导数dFdx和dFdy介绍
本文适合对webgl.计算机图形学.前端可视化感兴趣的读者. 偏导数函数(HLSL中的ddx和ddy,GLSL中的dFdx和dFdy)是片元着色器中的一个用于计算任何变量基于屏幕空间坐标的变化率的指令 ...
- Java基础中字符串与字符的注意点!
在Java中,字符的表达与字符串的表达是不一样的!话不多说,直接上代码!!! String a="a"; char a='a'; 其中他们的引号是不一样的
- python 中的__name__ == "__main__"(转)
有句话经典的概括了这段代码的意义: “Make a script both importable and executable” 意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可 ...
- fiddler无法抓取chrome浏览器请求的解决方案之关闭代理软件
最近安装fiddler后,按照通用设置后依然无法抓取到chrome的请求,经检查,我本地的chrome安装了代理管理的插件Switchy,无论选择直接连接还是选择使用代理连接,插件都会屏蔽fiddle ...
- 数字IC前后端设计中的时序收敛(六)--Max Fanout违反
本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...
- Java项目实例之---学生选课(面向对象复习)
学生选课(面向对象复习) 设计一个学生选课的程序,分别有学生类(Student)和课程类(Course) 学生类的属性有:学号(String),姓名(String),性别(char),所选科目(Cou ...
- 基于SpringCloud的Microservices架构实战案例-架构拆解
自第一篇< 基于SpringCloud的Microservices架构实战案例-序篇>发表出来后,差不多有半年时间了,一直也没有接着拆分完,有如读本书一样,也是需要契机的,还是要把未完成的 ...
- windows切换mac遇到的问题
1. 前端代码需要安装npm包 所以需要对整个文件夹都赋予管理员权限 2. 在npm i的时候如果权限不足 查看是哪一行调用了哪个文件夹,赋予权限 3. Dsp-fe 本地环境 除了需要配置host ...
- Socket网络编程系列教程序
C语言的用途相当多,可以用在数据结构.数据库.网络.嵌入式等方面,历经40多年不衰,真是厉害!最近一直想从某一应用方面写一个系列教程,好好地把某一方面讲深讲透. 正好博主对网络方面的编 ...
- Maven(二)Maven 的基本配置
Maven 的基本配置 Maven 中仓库的概念 Maven 中的仓库是用拿过来存储所有项目的依赖关系的.当你创建一个 Maven 项目时,Maven 会通过依赖机制先到你本地仓库(自己维护的仓库)中 ...