第十三节:Lambda、linq、SQL的相爱相杀(2)
一. Linq开篇
1.Where用法
linq中where的用法与SQL中where的用法基本一致。
1 #region 01-where用法2 {3 //1. where用法4 //1.1 查询账号为admin的用户信息5 Console.WriteLine("---------------------------- 1. where用法 ----------------------------------------");6 Console.WriteLine("---------------------------- 1.1 查询账号为admin的用户信息 ----------------------------------------");7 List<Sys_UserInfor> sUserList1 = (from u in db.Sys_UserInfor8 where u.userAccount == "admin"9 select u).ToList();
10
11 foreach (var item in sUserList1)
12 {
13 Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
14 }
15 //1.2 查询账号为中包含admin且性别为男的用户信息
16 Console.WriteLine("---------------------------- 1.2 查询账号为中包含admin且性别为男的用户信息 ----------------------------------------");
17 List<Sys_UserInfor> sUserList2 = (from u in db.Sys_UserInfor
18 where u.userAccount.Contains("admin") && u.userSex == "男"
19 select u).ToList();
20 foreach (var item in sUserList2)
21 {
22 Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
23 }
24 }
25 #endregion
2.Select用法
与前一个章节lambda中介绍的一样,select可以全部查询或查询部分字段
查询部分的时候可以使用匿名类或者实体类,使用匿名的时候也可以指定列名。
1 #region 02-select用法 (匿名类和非匿名类写法)2 {3 //2. select用法 (匿名类和非匿名类写法)4 //2.1 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (匿名类的写法,自动生成匿名类名称)5 Console.WriteLine("---------------------------- 2. select用法 (匿名类和非匿名类写法) ----------------------------------------");6 Console.WriteLine("-------------2.1 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (匿名类的写法)-------------------------");7 var sUserList1 = (from u in db.Sys_UserInfor8 where u.userAccount.Contains("admin")9 select new
10 {
11 u.userName,
12 u.userAge,
13 u.userSex
14 }).ToList();
15 sUserList1.ForEach(u =>
16 {
17 Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2}", u.userName, u.userAge, u.userSex);
18 });
19 //2.2 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (匿名类的写法,指定匿名类名称)
20 Console.WriteLine("---------2.2 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (匿名类的写法 指定匿名类名称)--------");
21 var sUserList2 = (from u in db.Sys_UserInfor
22 where u.userAccount.Contains("admin")
23 select new
24 {
25 Name = u.userName,
26 Age = u.userAge,
27 Sex = u.userSex
28 }).ToList();
29 sUserList2.ForEach(u =>
30 {
31 Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2}", u.Name, u.Age, u.Sex);
32 });
33 //2.3 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (非匿名类的写法)
34 Console.WriteLine("-------------2.3 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (非匿名类的写法)-------------------------");
35 List<newUserInfor> sUserList3 = (from u in db.Sys_UserInfor
36 where u.userAccount.Contains("admin")
37 select new newUserInfor
38 {
39 newName = u.userName,
40 newAge = u.userAge,
41 newSex = u.userSex
42 }).ToList();
43 sUserList3.ForEach(u =>
44 {
45 Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2}", u.newName, u.newAge, u.newSex);
46 });
47 }
48 #endregion
3.orderby用法
关键字是:orderby (默认是升序) 和orderby descending
需要按照多个条件进行升序或降序,格式为: orderby x1,x2 descending,x3 (表示先按照x1升序排,x1相同的话,再按照x2降序排,x2相同的话,在按照x3升序排列)
1 #region 03-orderby用法2 {3 //区分:在Lambda中有 orderby(OrderByDescending、ThenBy、ThenByDescending),但在Linq中 只有orderby (默认是升序) 和orderby descending4 //需要按照多个条件进行升序或降序,格式为: orderby x1,x2 descending,x3 (表示先按照x1升序排,x1相同的话,再按照x2降序排,x2相同的话,在按照x3升序排列)5 //3. OrderBy用法 (单条件升降序、多条件综合排序)6 //3.1 查询delflag 为1 的所有用户信息,按照时间升序排列7 Console.WriteLine("------3. orderby用法 (单条件升降序、多条件综合排序)-------------");8 Console.WriteLine("--------------------- 3.1 查询delflag 为1 的所有用户信息,按照时间升序排列 ------------------------------");9 List<Sys_UserInfor> sUserList1 = (from u in db.Sys_UserInfor
10 where u.delFlag == 1
11 orderby u.addTime
12 select u).ToList();
13 foreach (var item in sUserList1)
14 {
15 Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3},创建时间:{4}", item.userName, item.userAccount, item.userAge, item.userSex, item.addTime);
16 }
17 //3.2 查询delflag 为1 的所有用户信息,先按照时间升序排列,再按照年龄降序
18 Console.WriteLine("---------------3.2 查询delflag 为1 的所有用户信息,先按照时间升序排列,再按照年龄降序----------------------");
19 List<Sys_UserInfor> sUserList2 = (from u in db.Sys_UserInfor
20 where u.delFlag == 1
21 orderby u.addTime, u.userAge descending
22 select u).ToList();
23 foreach (var item in sUserList2)
24 {
25 Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3},创建时间:{4}", item.userName, item.userAccount, item.userAge, item.userSex, item.addTime);
26 }
27 }
28 #endregion
4.多表关联查询
详解:
这里类比SQL语句里的查询,查询包括内连接和外连接,其中,
内连接分为:隐式内连接和显示内连接.特点:查询出来的结果是多表交叉共有的。
外连接分为:左外连接和右外连接.
左外连接:查询出JOIN左边表的全部数据,JOIN右边的表不匹配的数据用NULL来填充。
右外连接:查询出JOIN右边表的全部数据,JOIN左边的表不匹配的数据用NULL来填充。
注意:外链接的用法,join时必须将join后的表into到一个新的变量XX中,然后要用XX.DefaultIfEmpty()表示外连接。DefaultIfEmpty使用了泛型中的default关键字。default关键字对于引用类型将返回null,而对于值类型则返回0。对于结构体类型,则会根据其成员类型将它们相应地初始化为null(引用类型)或0(值类型)
#region 04-多表关联查询{//4.查询账号中含有admin的所有用户的用户昵称、账号、和登录信息//4.1 隐式内连接的写法(匿名类且不指定名称)Console.WriteLine("---------------04-多表关联查询--------------------");Console.WriteLine("---------------4.1 隐式内连接的写法(匿名类且不指定名称)--------------------");var uList1 = (from a in db.Sys_UserInforfrom b in db.LoginRecordswhere a.id == b.userId && a.userAccount.Contains("admin")select new{a.userName,a.userAccount,b.loginCity,b.loginIp,b.loginTime}).ToList();foreach (var item in uList1){Console.WriteLine("姓名:{0},账号:{1},登录城市:{2},登录IP:{3},登录时间:{4}", item.userName, item.userAccount, item.loginCity, item.loginIp, item.loginTime);}//4.2 隐式外链接(匿名类 且部分列指定名称) Console.WriteLine("---------------4.2 隐式外链接(匿名类 且部分列指定名称) --------------------");var uList2 = (from a in db.Sys_UserInforjoin b in db.LoginRecords on a.id equals b.userIdwhere a.userAccount.Contains("admin")select new{UserName = a.userName,UserAccount = a.userAccount,b.loginCity,b.loginIp,b.loginTime}).ToList();foreach (var item in uList2){Console.WriteLine("姓名:{0},账号:{1},登录城市:{2},登录IP:{3},登录时间:{4}", item.UserName, item.UserAccount, item.loginCity, item.loginIp, item.loginTime);}//4.3 查询所有用户的登录信息(左外连接的方式)//join时必须将join后的表into到一个新的变量XX中,然后要用XX.DefaultIfEmpty()表示外连接。//DefaultIfEmpty使用了泛型中的default关键字。default关键字对于引用类型将返回null,而对于值类型则返回0。对于结构体类型,则会根据其成员类型将它们相应地初始化为null(引用类型)或0(值类型)Console.WriteLine("-----------------------4.3 查询所有用户的登录信息(外连接的方式)----------------------------");var uList3 = (from a in db.Sys_UserInforjoin b in db.LoginRecords on a.id equals b.userId into fkfrom c in fk.DefaultIfEmpty()select new{UserName = a.userName,UserAccount = a.userAccount,c.loginCity,c.loginIp,c.loginTime}).ToList();foreach (var item in uList3){Console.WriteLine("姓名:{0},账号:{1},登录城市:{2},登录IP:{3},登录时间:{4}", item.UserName, item.UserAccount, item.loginCity, item.loginIp, item.loginTime);}}#endregion
5. group by into 分组
1 #region 05-group By分组(匿名类写法)2 {3 //5. GroupBy分组(需要重点看一下)4 //5.1 根据用户的性别进行分类,然后将不同性别的用户信息输出来5 Console.WriteLine("-------------------- 5. GroupBy分组------------------------");6 Console.WriteLine("-------------------- 5.1 根据用户的性别进行分类,然后将不同性别的用户信息输出来------------------------");7 var sUserListGroup = (from u in db.Sys_UserInfor8 group u by u.userSex into fk9 select fk).ToList();
10 foreach (var group in sUserListGroup)
11 {
12 Console.WriteLine("性别为:{0}", group.Key); //分组依据的字段内容
13 foreach (var item in group)
14 {
15 Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
16 }
17 }
18 //5.2 根据用户性别进行分类,然后将不同性别的年龄大于等于21岁的用户信息输出来
19 Console.WriteLine("-------------5.2 根据用户性别进行分类,然后将不同性别的年龄大于等于21岁的用户信息输出来-------------------");
20 var sUserListGroup2 = (from u in db.Sys_UserInfor
21 where u.userAge >= 21
22 group u by u.userSex into fk
23 select fk).ToList();
24 foreach (var group in sUserListGroup2)
25 {
26 Console.WriteLine("性别为:{0}", group.Key); //分组依据的字段内容
27 foreach (var item in group)
28 {
29 Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
30 }
31 }
32 }
33 #endregion
6. skip和take用法
1 #region 06-Skip和Take用法2 {3 4 //6. Skip和Take 分页用法5 //skip表示跳过多少条,Take表示取多少条6 //6.1 根据时间降序排列,取第2和第3条数据(即先排序,然后跨过1条,取2条数据)7 Console.WriteLine("--------------------6. Skip和Take 分页用法------------------------");8 Console.WriteLine("---------6.1 根据时间降序排列,取用户信息中的第2和第3条数据(即先排序,然后跨过1条,取2条数据)---------");9 var sUserList = (from u in db.Sys_UserInfor
10 orderby u.addTime descending
11 select u).Skip(1).Take(2).ToList();
12 sUserList.ForEach(u =>
13 {
14 Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2},创建时间:{3}", u.userName, u.userAge, u.userSex, u.addTime);
15 });
16 }
17 #endregion
第十三节:Lambda、linq、SQL的相爱相杀(2)相关推荐
- 第十四节:Lambda、linq、SQL的相爱相杀(3)
一. SQL 开篇 1. where用法 1 #region 封装EF调用SQL语句查询 2 public static List<T> ExecuteQuery<T>(str ...
- 第十二节:Lambda、linq、SQL的相爱相杀(1)
一. 谈情怀 Lambda.Linq.SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用. 相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学 ...
- 阿里云CDN技术掌舵人文景:相爱相杀一路狂奔的这十年
提到阿里云CDN,不得不提技术掌舵人姚伟斌(文景),虽然他不是团队中最"老"的同学,但他却历经了淘宝业务发展最为飞速的几年,见证了从最初服务淘宝和集团内部的CDN,到如今国内服务客 ...
- 支付宝与微信转战刷脸支付,多年相爱相杀情归何处?
说起阿里巴巴与腾讯,似乎怎么也绕不开马云跟马化腾. 两马同台,自是不同凡响. 有次,两人同台颁奖. 主持人问马云:"你们都信马,你觉得两人之间最显著的区别是什么?" 马云笑答:&q ...
- 相爱相杀:移动联通IT支撑回忆录(八)
相爱相杀:移动联通IT支撑回忆录(八) 文 | 宁宇 我写的不是小说,而是我的印象和记忆中,移动与联通有关IT支撑的历史往事. 在十数年间,双方相互学习.相互借鉴,同时又相互竞争.相互敌视,在不同的阶 ...
- 司马懿和诸葛亮之间的相爱相杀
阅读本文大概需要2分钟 良好的习惯需要不断慢慢培养.我现在基本每天晚上的轨迹是这样的:每天晚上下班后,洗漱完基本就到晚上七点半左右了. 19:30-21:00 看电视剧. 21:00-21:30 ...
- 1024:我与CSDN的相爱相杀
文章目录 一.前言 二.与CSDN的相爱相杀 1.入目无人四下皆是你 2.金风玉露一相逢 3.待得九宵清风起 4.姜花深处无少年 三.总结 一.前言 不知不觉相伴CSDN已经三年有余,这三年时间登陆多 ...
- 相爱相杀:移动联通IT支撑回忆录(总结篇)
相爱相杀:移动联通IT支撑回忆录(总结篇)文 | 宁宇 北京西二环边的联通总部大楼上有几个大字:"创新·改变世界".这是2009年行业重组之后新联通提出的口号,而联通近几年IT支撑 ...
- 相爱相杀:移动联通IT支撑回忆录(十三)
相爱相杀:移动联通IT支撑回忆录(十三)文 | 宁宇 我写的不是小说,而是我的印象和记忆中,移动与联通有关IT支撑的历史往事. 在十数年间,双方相互学习.相互借鉴,同时又相互竞争.相互敌视,在不同的阶 ...
最新文章
- macOs下全局安装npm包的设置问题
- 敏捷开发框架_他山之石-敏捷开发管理框架在设计项目中的应用
- 从Python的turtle绘图开始学习图形化程序设计
- 登录判断_Spring Security之多次登录失败后账户锁定功能的实现
- rails3异步发邮件
- js创建对象之原型模式2原型与in操作符
- pytorch线性回归(笔记一)
- sqlparameter多个赋值一行完成_HashMap源码从面试题说起:请一行一行代码描述hashmap put方法...
- gradle生成java文件_使用Gradle for Java插件生成Java类
- 智驾科技MAXIEYE完成3亿元B轮融资,暂未取得品牌同名商标
- 代码审计之JAVA代码审计洞态IAST系统以及SecExample靶场
- 论文参考文献格式与设置
- html设置模块居中,DW怎么设置DIV模块在页面中居中?
- 为什么需要Code Review?
- 阿里云账号个人实名认证教程
- Descending Order 实践练习
- Linux查看CPU和内存使用情况
- Java基础学习:尚硅谷项目三 开发团队调度软件
- 《Flutter 控件大全》第十个:AnimatedIcon
- Macbook如何打开Chrome调试工具Developer Tools
热门文章
- android与php使用base64加密的字符串结果不一样解决方法
- java-上传文件与现实上传文件
- BZOJ 2242: [SDOI2011]计算器 [快速幂 BSGS]
- 06-CABasicAnimation基础核心动画
- Web请求中同步与异步的区别
- 【转载】C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()
- Oralce 9.2.0.6 到 9.2.0.8 升级 小结
- [Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]
- [Leedcode][JAVA][第876题][快慢指针]
- pythonxml模块高级用法_Python利用ElementTree模块处理XML的方法详解