欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

第十三节:Lambda、linq、SQL的相爱相杀(2)

发布时间:2023/12/10 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 第十三节: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)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。