zoukankan      html  css  js  c++  java
  • 第十四节:Lambda、linq、SQL的相爱相杀(3)

    一. SQL 开篇

    1. where用法

    1      #region 封装EF调用SQL语句查询
    2         public static List<T> ExecuteQuery<T>(string sql, params SqlParameter[] pars)
    3         {
    4             return db.Database.SqlQuery<T>(sql, pars).ToList();
    5         }
    6         #endregion
     1        #region 01-where用法
     2             {
     3                 //1. where用法
     4                 //1.1 查询账号为admin的用户信息
     5                 Console.WriteLine("---------------------------- 1. where用法   ----------------------------------------");
     6                 Console.WriteLine("---------------------------- 1.1 查询账号为admin的用户信息   ----------------------------------------");
     7                 string sql1 = @"select * from Sys_UserInfor where userAccount = 'admin'";
     8                 List<Sys_UserInfor> sUserList1 = ExecuteQuery<Sys_UserInfor>(sql1);
     9                 foreach (var item in sUserList1)
    10                 {
    11                     Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
    12                 }
    13                 //1.2  查询账号为中包含admin且性别为男的用户信息
    14                 Console.WriteLine("---------------------------- 1.2  查询账号为中包含admin且性别为男的用户信息   ----------------------------------------");
    15                 string sql2 = @"select * from Sys_UserInfor where userAccount like '%admin%' and userSex='男'";
    16                 List<Sys_UserInfor> sUserList2 = ExecuteQuery<Sys_UserInfor>(sql2);
    17                 foreach (var item in sUserList2)
    18                 {
    19                     Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
    20                 }
    21             }
    22             #endregion

    2. select用法

     1   #region 02-select用法
     2             {
     3                 //2. select用法 (SQL语句中,查询部分字段,必须要有个实体接收,不能用var类型接收)
     4                 //2.1 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息
     5                 Console.WriteLine("---------------------------- 2. select用法   ----------------------------------------");
     6                 Console.WriteLine("-------------2.1 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 )-------------------------");
     7                 string sql1 = @"select userName,userAge,userSex from Sys_UserInfor where userAccount like '%admin%'";
     8                 List<model1> sUserList1 = ExecuteQuery<model1>(sql1);
     9                 sUserList1.ForEach(u =>
    10                 {
    11                     Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2}", u.userName, u.userAge, u.userSex);
    12                 });
    13 
    14             }
    15             #endregion

     

    3. order by用法

     1   #region 03-order by用法
     2             {
     3                 //区分:在Lambda中有 orderby(OrderByDescending、ThenBy、ThenByDescending),但在SQL中 只有order by  asc(默认是升序) 和order by desc
     4                 //需要按照多个条件进行升序或降序,格式为: order by x1, x2 descending,x3(表示先按照x1升序排,x1相同的话,再按照x2降序排,x2相同的话,在按照x3升序排列)
     5                 //3. Order By用法 (单条件升降序、多条件综合排序)
     6                 //3.1 查询delflag 为1 的所有用户信息,按照时间升序排列
     7                 Console.WriteLine("------3. orderby用法  (单条件升降序、多条件综合排序)-------------");
     8                 Console.WriteLine("--------------------- 3.1 查询delflag 为1 的所有用户信息,按照时间升序排列   ------------------------------");
     9 
    10                 string sql1 = @"select * from Sys_UserInfor where delFlag =1 order by addTime";
    11                 List<Sys_UserInfor> sUserList1 = ExecuteQuery<Sys_UserInfor>(sql1);
    12                 foreach (var item in sUserList1)
    13                 {
    14                     Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3},创建时间:{4}", item.userName, item.userAccount, item.userAge, item.userSex, item.addTime);
    15                 }
    16                 //3.2 查询delflag 为1 的所有用户信息,先按照时间升序排列,再按照年龄降序
    17                 Console.WriteLine("---------------3.2 查询delflag 为1 的所有用户信息,先按照时间升序排列,再按照年龄降序----------------------");
    18                 string sql2 = @"select * from Sys_UserInfor where delFlag =1 order by addTime,userAge desc";
    19                 List<Sys_UserInfor> sUserList2 = ExecuteQuery<Sys_UserInfor>(sql2);
    20                 foreach (var item in sUserList2)
    21                 {
    22                     Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3},创建时间:{4}", item.userName, item.userAccount, item.userAge, item.userSex, item.addTime);
    23                 }
    24             }
    25             #endregion

     

    4. 多表关联查询

    用到的用户表和用户登录记录表中的数据如下:

      

     SQL中的关联包括:内连接、外连接、全连接。

    1.内连接:也叫等值连接,查询出来的结果是多表交叉共有的,关键字inner join进行连接,其中inner可以省略。

    PS:SQL中一般没有给内连接分类的,但在linq中通常分为显示内连接和隐式内连接。

      注意:单纯的select * from a,b是笛卡尔乘积。比如a表有5条数据,b表有3条数据,那么最后的结果有5*3=15条数据。但是如果对两个表进行关联:select * from a,b where a.id = b.id 意思就变了,此时就等价于:select * from a inner join b on a.id = b.id。即就是内连接,但是这种写法并不符合规范,可能只对某些数据库管用,如sqlserver。推荐最好不要这样写。最好写成inner join的写法。

    2.外连接:左外连接和右外连接.分别用left join 或right join 关键字来连接。

    (1).左外连接:查询出JOIN左边表的全部数据,JOIN右边的表不匹配的数据用NULL来填充。

    (2).右外连接:查询出JOIN右边表的全部数据,JOIN左边的表不匹配的数据用NULL来填充。 

     3.全连接:返回左表和右表中所有没有匹配的行,用关键字 full join来表示,适用于SQLServer,MySQL中没有这种用法

     1  //4.查询账号中含有admin的所有用户的用户昵称、账号、和登录信息
     2                 //4.1 内连接的写法1
     3                 Console.WriteLine("---------------04-多表关联查询--------------------");
     4                 Console.WriteLine("---------------4.1 内连接的写法1--------------------");
     5                 string sql1 = @"select a.userName,a.userAccount,b.loginCity,b.loginIp,b.loginTime
     6                                 from Sys_UserInfor a,LoginRecords b
     7                                 where a.id =b.userId";
     8                 List<model2> uList1 = ExecuteQuery<model2>(sql1);
     9                 foreach (var item in uList1)
    10                 {
    11                     Console.WriteLine("姓名:{0},账号:{1},登录城市:{2},登录IP:{3},登录时间:{4}", item.userName, item.userAccount, item.loginCity, item.loginIp, item.loginTime);
    12                 }
    13                 //4.2 内连接的写法2
    14                 Console.WriteLine("---------------4.2 内连接的写法2 --------------------");
    15                 string sql2 = @"select a.userName,a.userAccount,b.loginCity,b.loginIp,b.loginTime
    16                                 from Sys_UserInfor a inner join LoginRecords b on  a.id =b.userId";
    17 
    18                 List<model2> uList2 = ExecuteQuery<model2>(sql2);
    19                 foreach (var item in uList2)
    20                 {
    21                     Console.WriteLine("姓名:{0},账号:{1},登录城市:{2},登录IP:{3},登录时间:{4}", item.userName, item.userAccount, item.loginCity, item.loginIp, item.loginTime);
    22                 }
    23 
    24                 //4.3 查询所有用户的登录信息(左外连接的方式)
    25                 Console.WriteLine("-----------------------4.3 查询所有用户的登录信息(左外连接的方式)----------------------------");
    26                 string sql3 = @"select a.userName,a.userAccount,b.loginCity,b.loginIp,b.loginTime
    27                                 from Sys_UserInfor a left join LoginRecords b on  a.id =b.userId
    28                                 ";
    29                 List<model2> uList3 = ExecuteQuery<model2>(sql3);
    30                 foreach (var item in uList3)
    31                 {
    32                     Console.WriteLine("姓名:{0},账号:{1},登录城市:{2},登录IP:{3},登录时间:{4}", item.userName, item.userAccount, item.loginCity, item.loginIp, item.loginTime);
    33                 }
    34 
    35                 //4.4 查询所有用户的登录信息(右外连接的方式)
    36                 Console.WriteLine("-----------------------4.4 查询所有用户的登录信息(右外连接的方式)----------------------------");
    37                 string sql4 = @"select a.userName,a.userAccount,b.loginCity,b.loginIp,b.loginTime
    38                                 from Sys_UserInfor a right join LoginRecords b on  a.id =b.userId
    39                                 ";
    40                 List<model2> uList4 = ExecuteQuery<model2>(sql4);
    41                 foreach (var item in uList4)
    42                 {
    43                     Console.WriteLine("姓名:{0},账号:{1},登录城市:{2},登录IP:{3},登录时间:{4}", item.userName, item.userAccount, item.loginCity, item.loginIp, item.loginTime);
    44                 }
    45                 //4.5 查询所有用户的登录信息(全连接)
    46                 Console.WriteLine("-----------------------4.5 查询所有用户的登录信息(全连接)----------------------------");
    47                 string sql5 = @"select a.userName,a.userAccount,b.loginCity,b.loginIp,b.loginTime
    48                                 from Sys_UserInfor a full join LoginRecords b on  a.id =b.userId
    49                                 ";
    50                 List<model2> uList5 = ExecuteQuery<model2>(sql5);
    51                 foreach (var item in uList5)
    52                 {
    53                     Console.WriteLine("姓名:{0},账号:{1},登录城市:{2},登录IP:{3},登录时间:{4}", item.userName, item.userAccount, item.loginCity, item.loginIp, item.loginTime);
    54                 }

     运行结果:

     

      5. group By用法

      group By分组(SQL中的group by分组和linq、lambda完全不同。特别注意:select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中) 常见的聚合函数有:sum avg min max

     1   #region 05-group By分组
     2             {
     3                 //5. Group By分组(SQL中的group by分组和linq、lambda完全不同,
     4                 /*特别注意:select指定的字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中)
     5                  常见的聚合函数有:sum avg min max
     6                  */
     7 
     8                 //5.1 根据用户的性别进行分类,并且统计不同性别的年龄总和
     9                 Console.WriteLine("-------------------- 5. GroupBy分组------------------------");
    10                 Console.WriteLine("-------------------- 5.1 根据用户的性别进行分类,并且统计不同性别的年龄总和------------------------");
    11                 string sql1 = @"select userSex,SUM(userAge) as TotalAges
    12                                 from Sys_UserInfor
    13                                 group by userSex";
    14                 List<model3> sUserListGroup1 = ExecuteQuery<model3>(sql1);
    15                 foreach (var item in sUserListGroup1)
    16                 {
    17                       Console.WriteLine("性别:{0},年龄总和:{1}", item.userSex, item.TotalAges);
    18                 }
    19                  
    20                 //5.2 根据用户性别进行分类,并且统计不同性别年龄的最大值
    21                 Console.WriteLine("-------------5.2 根据用户性别进行分类,并且统计不同性别年龄的最大值-------------------");
    22                 string sql2 = @"select userSex,MAX(userAge) as TotalAges
    23                                 from Sys_UserInfor
    24                                 group by userSex";
    25                 List<model3> sUserListGroup2 = ExecuteQuery<model3>(sql2);
    26                 foreach (var item in sUserListGroup2)
    27                 {
    28                     Console.WriteLine("性别:{0},年龄最大值:{1}", item.userSex, item.TotalAges);
    29                 }
    30             }
    31             #endregion

     

    6. 分页用法

  • 相关阅读:
    win7用VMware安装CentOs7搭建Linux环境
    安装Vmware并破解
    Webpack打包
    jquery获取动态table列表的值并组装成数组返回
    微信、钉钉、浏览器上H5页面头部标题(title)的修改,不刷新问题
    帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
    mysql常用语句
    JQuery日期插件
    系统激活教程及文件
    git教程
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/7338563.html
Copyright © 2011-2022 走看看