.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技术优化精简你的代码.特性标签可以运用在程序集,模块, ...
随机推荐
- 深度残差网络(ResNet)
引言 对于传统的深度学习网络应用来说,网络越深,所能学到的东西越多.当然收敛速度也就越慢,训练时间越长,然而深度到了一定程度之后就会发现越往深学习率越低的情况,甚至在一些场景下,网络层数越深反而降低了 ...
- Python 3.6 安装
1. 下载 # 我下载到了 /tmp 目录中 cd /tmp wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz 2. 安装依赖 ...
- Codeforces Gym101161E:ACM Tax(主席树+LCA)
题目链接 题意 给出一棵有边权的树,然后给出q个查询,每次查询问两个结点的路径上的边的长度的中位数是多少. 思路 这道题目是用主席树(用权值当结点)和LCA来做的. 和之前做过的区间第K大类似,这道题 ...
- SQL Server 触发器和事务
一.触发器 1. 定义 --基本语法 create trigger Trigger_Name on TableName for type --type:insert,update,delete as ...
- JVM监控jconsole
1. 描述 程序在开发过程中,有可能会发生CPU飙高.内存溢出等问题或系统在后期调优阶段,不可避免的要监控JVM情况,JDK自带的Jconsole监控工具,结合Tomcat使用非常方便,占用内存小 ...
- Bzoj 2288 生日礼物题解
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 856 Solved: 260[Submit][S ...
- shell_链接命令ln与nohup命令使用方法
ln命令是一个链接命令,工作中用的比较多的就是对一个文件或者是目录建立起软连接.软连接的概念类似于windows下的快捷方式.比如,在win下,我们经常在安装完word.ppt等office程序后,在 ...
- Postgresql_fdw
Postgresql_fdw 测试环境 Ubuntu 16.04 LTS云主机2台,主机名为pg1(192.168.0.34)和pg2(192.168.0.39). 安装postgresql 下面这个 ...
- Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)
简介 看<西游记>第五十七回,说是“六耳猕猴”化作孙悟空的摸样,伤了唐僧,后又和孙悟空大打出手…… 这位假孙悟空,实力不用多说了吧,和真孙悟空一般无二,大战孙悟空,闹到上天入地下海. 在唐 ...
- python面向对象的继承-组合-02
*面向对象(OOP)的三大特征:**# 封装.继承.多态 继承 什么是继承 继承:# 是一种关系,描述两个对象之间什么是什么的什么的关系 例如:麦兜.佩奇.猪猪侠.猪刚鬣,都是猪 为什么要使用继承 继 ...