一. 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