前言
揭示:为了可能将知识点学得更加透彻、记得更加牢固 我会通过教学解说的形式把常识写下来 因为在过程中会让人从学生变成老师 这个过程会开掘出新的常识和观点 是一个自我思维切换而达成的常识深度开掘和晋升的过程 如果能帮忙到大家那就最好 如果有讲错的中央还请多多指教!我只是一只菜鸡 感激了解!
1、初识LINQ
置信大家多多少少都在网上或者书里看到过LINQ这玩意,那它到底是个什么玩意呢?明天就和大家一起来学习下LINQ
LINQ是集成到C#和VB .NET这些语言中用于提供查问数据能力的一个新特色
在关系型数据库中,数据被组织放入规范性很好的表中,并且通过简略而又弱小的语言SQL来进行拜访,然而程序中却与数据库相同,保留在类对象或构造中的数据差别很大,因而没有通用的查问语句来从数据结构中获取数据,自C#3.0引入LINQ后,咱们便有了查问对象数据的能力
就是说LINQ是C#提供给了咱们开发者一个疾速查问数据的能力
LINQ-----------让语言更柔美,让查问更便捷,让代码更杰出。
2、简略的LINQ案例
先来一个示例,让大伙看看LINQ的魅力所在
要应用LINQ的话就要援用它所在的命名空间 using System.Linq;
using System;using System.Collections.Generic;using System.Linq;namespace ConsoleApp1{ class GameText { public int gameID; //游戏ID public string gameName; //游戏名称 public string gameIntduced; //游戏介绍 public int gameSize; //游戏大小 } class Program { static List<GameText> game = new List<GameText>() { new GameText(){gameID = 1,gameName = "东凑西凑",gameIntduced = "这是一个2D实习面试我的项目",gameSize = 1}, new GameText(){gameID = 2,gameName = "同桌的你",gameIntduced = "这是一个青春校园题材的游戏",gameSize = 5}, }; static void Main(string[] args) { var res = from m in game where m.gameID > 1 select m.gameName; foreach (var item in res) { Console.WriteLine(item); } } }}
次要看这个中央
var res = from m in game where m.gameID > 1 select m.gameName;
from in 都是关键字 game是咱们要查问的数据的对象 m示意game外面的元素
where 是用来做条件限度的 这里我写了一个m.gameID > 1的条件 意思就是查问game汇合中的gameID大于1的元素
select m.gameName 查出满足条件的游戏并返回它的游戏名称
咱们来看下输入后果
东凑西凑游戏ID为1 同座的你ID为2
where m.gameID > 1
显然是同座的你这款游戏符合条件 所以最初咱们失去的是同座的你这款游戏
看吧是不是很简略,本人入手敲一下马上就能了解了!
3、对于LINQ的不同语法
刚刚的案例讲的是LINQ表达式的写法也称(查问语法),这里咱们还能够应用办法语法来进行数据查问
查问语法(query syntax)是申明模式的,看上去和SQL语句很类似。查问语法应用查问表达式模式书写。
办法语句(method syntax)是命令模式的,它应用的是规范的办法调用。办法是一组叫做规范查问运算符的办法
只有咱们援用了System.Linq; 咱们就能够调用Where办法
System.Linq命名空间下有一个Enumerable类
Enumerable类为咱们开发者提供了超多扩大办法和共享方法,这外面水应该挺深了没怎么钻研跳过,咱们间接操作汇合而后.调用外面的where办法就好了
它须要咱们传入一个Func委托 这里有两种写法
一种是用Lambda表达式来做,另一种就是比拟麻烦的独自写一个办法
先来麻烦的、其实也简略Where就是做过滤用的,外部会让汇合每个元素都调用咱们传进行的办法 所以咱们要写一个参数为GameText、返回值为bool的办法传到where中
//var res = from m in game// where m.gameID > 1// select m.gameName;var res = game.Where(whereFunc);foreach (var item in res){ Console.WriteLine(item.gameName.ToString());}static bool whereFunc(GameText t){ if (t.gameID > 1) return true; return false;}
启动程序 输入也是 同座的你 没故障老铁
嗯确实也就几步 不算太麻烦,然而Lambda表达式能让它更加简单化
//var res = from m in game// where m.gameID > 1// select m.gameName;//var res = game.Where(whereFunc);var res = game.Where(g => g.gameID > 1);foreach (var item in res){ Console.WriteLine(item.gameName.ToString());}//static bool whereFunc(GameText t)//{// if (t.gameID > 1) return true;// return false;//}
还是输入了同座的你 没故障!
4、LINQ多表查问操作
要进行多表操作咱们就要学习联结查问,学过SQL的同学应该对联结并不生疏,恰好我只是略微碰过SQL一下,头一回学联结这个知识点,那它到底是个什么玩意呢?
联结查问承受两个汇合而后创立一个长期的对象汇合,要想进行联结操作那就必须每个源对象中须要共享某个能够进行比拟,以判断是否相等的值才能够进行联结
间接上示例 一看示例就懂了
using System;using System.Collections.Generic;using System.Linq;namespace ConsoleApp1{ class Gamer { public int id; public string playName; } class GameText { public string gameName; public int id; } class Program { static List<Gamer> game = new List<Gamer>() { new Gamer(){id = 0,playName = "小红"}, new Gamer(){id = 1,playName = "小黑"}, new Gamer(){id = 2,playName = "小蓝"}, new Gamer(){id = 3,playName = "小黄"}, new Gamer(){id = 4,playName = "小小"}, }; static List<GameText> game2 = new List<GameText>() { new GameText(){gameName = "东凑西凑",id = 1}, new GameText(){gameName = "东凑西凑",id = 4}, new GameText(){gameName = "同座的你",id = 0}, new GameText(){gameName = "同座的你",id = 2}, new GameText(){gameName = "同座的你",id = 3}, }; }}
当初咱们有两个类
Gamer存储的是玩家的ID和名字
GameText存储的是游戏的名字和玩耍此游戏玩家的ID
当初咱们单纯查game表只能失去玩家的名字和ID并不能查到这个玩家玩的是哪一款游戏,这个时候咱们就能够用到LINQ里的联结操作(join子句)
static void Main(string[] args){var res = from g in game join g2 in game2 on g.id equals g2.id where g2.gameName == "同座的你" select new { playerName = g.playName, gameName = g2.gameName }; //匿名类型对象 //var res = game.Where(g => g.gameID > 1); foreach (var item in res) { Console.WriteLine(item); }}
后面几个关键字都解释过了 这里就讲讲join的操作
join g2 in game2 这句话齐全的意思和 from g in game 一样的
(这里要留神查问表达式必须从from子句开始)
from 前面跟的是要做查问的对象
join 前面跟的是要联结的对象(示意要和那个汇合做联结)
on 前面是联结条件
如果g.id 和 g2.id 相等 就判断上面的条件where g2.gameName == "同座的你"
**Gamer存储的是玩家的ID和名字
GameText存储的是游戏的名字和玩耍此游戏玩家的ID**
他们的ID雷同并且玩的是同座的你这款游戏那就满足了查问条件
回去看回咱们的那个表 是不是 小红 小蓝 小黄 这三个人玩的是同座的你这款游戏
嗯输入的后果 没故障
这里如同还有一种叫联结查问,我没有搞懂他们两个之间的关系,感觉实质上是一样的也是能够进行多表查问操作,坐等哪位老哥教教弟弟!
这里我也把联结查问的写进去 其余货色都不须要变
static void Main(string[] args){ var res = from g in game from g2 in game2 where g.id == g2.id && g2.gameName == "东凑西凑" select new { playerName = g.playName, gameName = g2.gameName }; foreach (var item in res) { Console.WriteLine(item); }}
不多解释了 应该不难理解吧。
5、LINQ对查问后果做排序操作
这里介绍orderby子句
orderby子句承受一个表达式并依据表达式一次返回后果项
orderby子句默认排序是升序,咱们也能够通过ascending和descending关键字显式设置元素的排序为升序还是降序
一起来看看示例
就加了一句orderby g.id descending 其余代码不变
using System;using System.Collections.Generic;using System.Linq;namespace ConsoleApp1{ class Gamer { public int id; public string playName; } class GameText { public string gameName; public int id; } class Program { static List<Gamer> game = new List<Gamer>() { new Gamer(){id = 0,playName = "小红"}, new Gamer(){id = 1,playName = "小黑"}, new Gamer(){id = 2,playName = "小蓝"}, new Gamer(){id = 3,playName = "小黄"}, new Gamer(){id = 4,playName = "小小"}, }; static List<GameText> game2 = new List<GameText>() { new GameText(){gameName = "东凑西凑",id = 1}, new GameText(){gameName = "东凑西凑",id = 4}, new GameText(){gameName = "同座的你",id = 0}, new GameText(){gameName = "同座的你",id = 2}, new GameText(){gameName = "同座的你",id = 3}, }; static void Main(string[] args) { var res = from g in game join g2 in game2 on g.id equals g2.id where g2.gameName == "同座的你" orderby g.id descending select new { playerName = g.playName, gameName = g2.gameName }; foreach (var item in res) { Console.WriteLine(item); } } }}
因为默认咱们ID就是0 1 2 3.. 升序的 所以咱们把数据倒序来看看成果
升序状态下应该输入的是 小红小蓝小黄
咱们用orderby g.id descending 按 g.id来倒序输入后果
所以输入了小黄 小蓝 小红