第十二节:Lambda、linq、SQL的相爱相杀(1)

一. 谈情怀

   Lambda、Linq、SQL伴随着我的开发一年又一年,但它们三者并没有此消彼长,各自占有这一定的比重,起着不可替代的作用。

     相信我们最先接触的应该就是SQL了,凡是科班出身的人,大学期间都会学习SQL Server数据库,当然也会学习SQL语言了(顺便吐槽一下,学校用SQL Server版本真老,好像是2005,我现在都用2016了),补充一点:主流数据库像SQL Sever、MySQL、Oracle某些语句是不同的,在后面介绍分页的时候会有体现。

    (1). SQL:是关系型数据库标准语言,其特点:简单,灵活,功能强大。(详细的概念介绍见  数据库概述)

    后来在工作中接触到了强大的ORM框架EF,发现了一种写法  db.Sys_UserInfor.Where(u => u.userAccount == "admin").ToList(); 彻底颠覆了我的三观,查询数据库,竟然可以这么简单,后来查询了一下,这个东西叫Lambda

    (2). Lambda:是比匿名方法更简洁的一种语法,包括 Lambda表达式 和 Lambda语句 。

  补充Lambad的发展历史:  

  A. 内置委托: new Func<string, int>(delegate(string str) { return str.Length; }); 

  B. 匿名方法: delegate(string str){return str.Length;}

  C. lambda语句: (string str)=>{return str.Length;}

  D. lambda表达式: (string str)=> str.Length

  E.让编译器推断类型: (str)=> str.Length

  F. 去掉不必要的括弧: str=> str.Length

  注意:Lambda语句 和 Lambda表达式 的区别在于,前者在 =>右边有一个语句块(大括号),而后者只有一个表达式(没有return 和大括号)。Lambda本身无类型,所以不能赋值给 var 变量。编译时会生成一个静态方法, 然后再实例化成委托传递。

  1. Lambda表达式: list.FindAll(d => d.Id > 2);   又名:点标记。

  2. Lambda语句:list.ForEach(d => { if (d.Id > 2) { Response.Write(d.ToString()); } });

    (3). Linq:是最接近SQL语言的一种查询表达式,又称语言集成查询,它是C# 3.0 时代的产物。

       它与SQL写法上的本质区别是: linq是以from开头 select 或group by结尾。

二. 数据准备

 我们准备两张表 用户表Sys_UserInfor和用户登录记录表LoginRecords。

   表结构:

     

     

 表数据:

      

     

三. Lambda开篇

1. Where用法

 Where用法相对比较简单,多个并列条件可以在一个Where中用&&符号链接,也可以写过个Where,最终的结果结果相同

复制代码

 1        DataDBEntities db = new DataDBEntities();2             #region 01-where用法3             {4                 //1. where用法5                 //1.1 查询账号为admin的用户信息6                 Console.WriteLine("---------------------------- 1. where用法   ----------------------------------------");7                 Console.WriteLine("---------------------------- 1.1 查询账号为admin的用户信息   ----------------------------------------");8                 List<Sys_UserInfor> sUserList1 = db.Sys_UserInfor.Where(u => u.userAccount == "admin").ToList();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                 List<Sys_UserInfor> sUserList2 = db.Sys_UserInfor.Where(u => u.userAccount.Contains("admin") && u.userSex == "男").ToList();
16                 foreach (var item in sUserList2)
17                 {
18                     Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
19                 }
20             }
21             #endregion

复制代码

2. Select用法

  Select中可以查询所有数据,也可以查询指定字段。

       当查询所有数据的时候可以这么写:var sUserList22 = db.Sys_UserInfor.Where(u => u.userAccount.Contains("admin")).Select(u=>u).ToList();  或者直接可以省略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 = db.Sys_UserInfor.Where(u => u.userAccount.Contains("admin")).Select(u => new8                 {9                     u.userName,
10                     u.userAge,
11                     u.userSex
12                 }).ToList();
13                 sUserList1.ForEach(u =>
14                 {
15                     Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2}", u.userName, u.userAge, u.userSex);
16                 });
17                 //2.2 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (匿名类的写法,指定匿名类名称)
18                 Console.WriteLine("---------2.2 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (匿名类的写法 指定匿名类名称)--------");
19                 var sUserList2 = db.Sys_UserInfor.Where(u => u.userAccount.Contains("admin")).Select(u => new
20                 {
21                     Name = u.userName,
22                     Age = u.userAge,
23                     Sex = u.userSex
24                 }).ToList();
25                 sUserList2.ForEach(u =>
26                 {
27                     Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2}", u.Name, u.Age, u.Sex);
28                 });
29                 //2.3 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (非匿名类的写法)
30                 Console.WriteLine("-------------2.3 查询账号中包含 admin 的用户的 姓名、年龄和性别 三条信息 (非匿名类的写法)-------------------------");
31                 List<newUserInfor> sUserList3 = db.Sys_UserInfor.Where(u => u.userAccount.Contains("admin")).Select(u => new newUserInfor
32                 {
33                     newName = u.userName,
34                     newAge = u.userAge,
35                     newSex = u.userSex
36                 }).ToList();
37                 sUserList3.ForEach(u =>
38                 {
39                     Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2}", u.newName, u.newAge, u.newSex);
40                 });
41             }
42             #endregion

复制代码

3. OrderBy(OrderByDescending、ThenBy、ThenByDescending)用法

  排序的用法在Lambda、Linq和SQL中相差还是很大的,写法的关键字截然不同。

  在Lambda中:升序: OrderBy→ThenBy→ThenBy

         降序: OrderByDescending→ThenByDescending

       先升序后降序再升序: OrderBy→ThenByDescending→ThenBy

复制代码

 1       #region 03-OrderBy(OrderByDescending、ThenBy、ThenByDescending)用法2             {3                 //3. OrderBy(OrderByDescending、ThenBy、ThenByDescending)用法  (单条件升降序、多条件综合排序)4                 //3.1 查询delflag 为1 的所有用户信息,按照时间升序排列5                 Console.WriteLine("------3. OrderBy(OrderByDescending、ThenBy、ThenByDescending)用法  (单条件升降序、多条件综合排序)-------------");6                 Console.WriteLine("--------------------- 3.1 查询delflag 为1 的所有用户信息,按照时间升序排列   ------------------------------");7                 List<Sys_UserInfor> sUserList1 = db.Sys_UserInfor.Where(u => u.delFlag == 1).OrderBy(u => u.addTime).ToList();8                 foreach (var item in sUserList1)9                 {
10                     Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3},创建时间:{4}", item.userName, item.userAccount, item.userAge, item.userSex, item.addTime);
11                 }
12                 //3.2 查询delflag 为1 的所有用户信息,先按照时间升序排列,再按照年龄降序
13                 Console.WriteLine("---------------3.2 查询delflag 为1 的所有用户信息,先按照时间升序排列,再按照年龄降序----------------------");
14                 List<Sys_UserInfor> sUserList2 = db.Sys_UserInfor.Where(u => u.delFlag == 1).OrderBy(u => u.addTime).ThenByDescending(u => u.userAge).ToList();
15                 foreach (var item in sUserList2)
16                 {
17                     Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3},创建时间:{4}", item.userName, item.userAccount, item.userAge, item.userSex, item.addTime);
18                 }
19             }
20             #endregion

复制代码

 

4. join连接查询

  这里展示的类似全连接的查询,在多表查询,特别是内连接和外链接方面明显不如 Linq和SQL。

复制代码

 1  #region 04-join连接查询(作用仅限与此么?)2             {3                 //4. join连接查询(匿名类和非匿名类)4                 Console.WriteLine("-------------------- 4. join连接查询(匿名类和非匿名类)------------------------");5                 var sUserList = db.Sys_UserInfor;6                 var sLoginRecordsList = db.LoginRecords;7                 var newList = sUserList.Join(sLoginRecordsList, u => u.id, p => p.userId, (u, p) => new8                   {9                       UserName = u.userName,
10                       LoginIp = p.loginIp,
11                       LoginCity = p.loginCity,
12                       LoginTime = p.loginTime
13 
14                   }).ToList();
15                 newList.ForEach(a => Console.WriteLine("姓名:{0},登录IP:{1},登录城市:{2},登录时间:{3}", a.UserName, a.LoginIp, a.LoginCity, a.LoginTime));
16 
17                 //非匿名类的情况与上述select中的用法相似
18             } 
19             #endregion

复制代码

 

5. GroupBy分组(匿名类写法)

  这里建议使用var类型接收,原类型太难记忆了,记住一点Lambda和Linq可以把分组依据和分组后对应的数据一次性全部拿出来,但是SQL中分组只能查询分组的依据和使用聚合函数处理其它字段,不能直接查询非分组依据以外的字段。

复制代码

 1  #region 05-GroupBy分组(匿名类写法)2             {3                 //5. GroupBy分组(需要重点看一下)4                 //5.1 根据用户的性别进行分类,然后将不同性别的用户信息输出来5                 Console.WriteLine("-------------------- 5. GroupBy分组------------------------");6                 Console.WriteLine("-------------------- 5.1 根据用户的性别进行分类,然后将不同性别的用户信息输出来------------------------");7                 var sUserListGroup = db.Sys_UserInfor.GroupBy(u => u.userSex).ToList();8                 foreach (var group in sUserListGroup)9                 {
10                     Console.WriteLine("性别为:{0}", group.Key);    //分组依据的字段内容
11                     foreach (var item in group)
12                     {
13                         Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
14                     }
15                 }
16                 //5.2 根据用户性别进行分类,然后将不同性别的年龄大于等于21岁的用户信息输出来
17                 Console.WriteLine("-------------5.2 根据用户性别进行分类,然后将不同性别的年龄大于等于21岁的用户信息输出来-------------------");
18                 var sUserListGroup2 = db.Sys_UserInfor.Where(u => u.userAge >= 21).GroupBy(u => u.userSex).ToList();
19                 foreach (var group in sUserListGroup2)
20                 {
21                     Console.WriteLine("性别为:{0}", group.Key);    //分组依据的字段内容
22                     foreach (var item in group)
23                     {
24                         Console.WriteLine("用户名:{0},用户账号:{1},用户年龄:{2},用户性别:{3}", item.userName, item.userAccount, item.userAge, item.userSex);
25                     }
26                 }
27             } 
28             #endregion

复制代码

 

6. Skip和Take用法

  这里结合Skip和Take写分页,太方便了,分页公式:   

    data.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
 补充MySQL数据中特有的分页,也很方便,分页公式:SELECT * FROM 表名 LIMIT (pageIndex-1)*pageSize,pageSize .

复制代码

 1   #region 06-Skip和Take用法2             {3                 //6. Skip和Take 分页用法4                 //skip表示跳过多少条,Take表示取多少条5                 //6.1 根据时间降序排列,取第2和第3条数据(即先排序,然后跨过1条,取2条数据)6                 Console.WriteLine("--------------------6. Skip和Take 分页用法------------------------");7                 Console.WriteLine("---------6.1 根据时间降序排列,取第2和第3条数据(即先排序,然后跨过1条,取2条数据)---------");8                 var sUserList = db.Sys_UserInfor.OrderByDescending(u => u.addTime).Skip(1).Take(2).ToList();9                 sUserList.ForEach(u =>
10                 {
11                     Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2},创建时间:{3}", u.userName, u.userAge, u.userSex, u.addTime);
12                 });
13 
14                 // 6.2 分页公式
15                 // 每页两条数据,根据时间降序,取第三页的所有数据
16                 Console.WriteLine("---------6.2 每页两条数据,根据时间降序,取第三页的所有数据---------");
17                 var sUserList2 = GetDataByIndex(db.Sys_UserInfor.OrderByDescending(u => u.addTime).ToList(), 3, 2);
18                 sUserList2.ForEach(u =>
19                 {
20                     Console.WriteLine("用户名:{0},用户年龄:{1},用户性别:{2},创建时间:{3}", u.userName, u.userAge, u.userSex, u.addTime);
21                 });
22             } 
23             #endregion

复制代码

1     #region 分页公式
2         static List<Sys_UserInfor> GetDataByIndex(List<Sys_UserInfor> data, int pageIndex, int pageSize)
3         {
4             return data.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
5         } 
6         #endregion

 

7. GroupJoin外连接查询(相当于left Join)

复制代码

 1  #region 06-GroupJoin外连接查询(相当于left Join)2                 {3                     Console.WriteLine("-------------------- 06-GroupJoin多表关联分组------------------------");4                     Console.WriteLine("--------------------根据性别分组,输出相同性别的用户和登录城市 ------------------------");5                     var list = db.Sys_UserInfor.GroupJoin(db.LoginRecord2, (Sys_UserInfor a) => a.id, (LoginRecord2 b) => b.userId, (m,n) => new6                     {7                         m.userName,8                         n9                     }).ToList();
10 
11                     foreach (var item in list)
12                     {
13                         var userName = item.userName;
14                         foreach (var cItem in item.n.ToList())
15                         {
16                             Console.WriteLine("用户名为{0}的用户的登录城市是:{1},登录时间是:{2}", userName, cItem.loginCity,cItem.loginTime);
17                         }
18                     }
19                 }
20                 #endregion

复制代码

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php java 共享session_PHP 实现多服务器共享 SESSION 数据

一、问题起源稍大一些的网站&#xff0c;通常都会有好几个服务器&#xff0c;每个服务器运行着不同功能的模块&#xff0c;使用不同的二级域名&#xff0c;而一个整体性强的网站&#xff0c;用户系统是统一的&#xff0c;即一套用户名、密码在整个网站的各个模块中都是可以登录…

第十三节: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("------------…

asp 调用java文件上传_用asp实现文件浏览、上传、下载的程序

可以放在服务器上&#xff0c;对服务器上的文件进行浏览、上传、下载&#xff0c;可下载文件源码。把下所有代码入在一个文件里即可&#xff0c;文件的后缀要为asp。thedir request("thedir")if thedir "" thenfolderini server.mappath(".")…

第十四节: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 …

hive mysql windows_Java-从MySQL到Hive导入,其中MySQL在Windows上运行,而Hive在Cent OS上运行(Horton Sandbox)...

在任何答案和评论之前.我尝试了在Stackoverflow中找到的几个选项,但均以失败告终.以下是这些链接-我通过命令行在Horton Sandbox中进行了尝试并成功.sqoop import --connect jdbc:mysql://192.168.56.101:3316/database_name --usernameuser --passwordpwd --table table_name …

第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

一. 基本介绍 回忆&#xff1a; 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候&#xff0c;发现where方法里的参数是Expression<Func<T,bool>>这么一个类型&#xff0c;当初不是很理解&#xff0c;只是知道传入lambda表达式使用即可&…

Php7 mongodb explain,【代码片-1】 php7 mongoDB 简单封装

/*** mongoDB 简单 封装* 注意&#xff1a;支持 mongoDB 3.2** author color_wind*/finalclassm_mgdb {privatestatic$ins [];privatestatic$def"default";private$_conn null;private$_db null;privatestatic$_config ["default"> ["url">…

IIS Web 服务器/ASP.NET 运行原理基本知识概念整理

前言&#xff1a; 记录 IIS 相关的笔记还是从公司笔试考核题开始的&#xff0c;问 Application Pool 与 AppDomain 的区别&#xff1f; 促使我对进程池进了知识的学习&#xff0c;所以记录一下学习的笔记。 我们知道现在 .NET 就业来看&#xff0c;80% 的 .NET 程序员都是从事 …

java正则表达式 ascii,是否可以检查字符串是否在Java中仅包含ASCII?

使用正则表达式您可以使用以下正则表达式查找特定的String值是否包含ASCII字符-\\A\\p{ASCII}*\\zString类的matches()方法接受正则表达式&#xff0c;并验证当前字符串是否与给定表达式匹配(如果匹配)&#xff0c;则返回true&#xff0c;否则返回false。因此&#xff0c;通过将…

Http请求处理流程

从一个页面比如www.xuxiaoyu.net的请求开始如何就能打开blogs页面的呢&#xff1f;这其中发生了什么样的东西&#xff1f; Http请求(Http Request) 当服务器&#xff08;IIS&#xff09;接受到一个Http请求的时候进行以下步骤的处理&#xff1a; 1)服务器获取所请求的页面的后缀…

matlab 基金业绩归因,基金专题报告:基于净值和持仓的基金业绩归因方法研究...

核心观点&#xff1a;当前主流的基金业绩归因方法主要有两个方向&#xff1a;一是基于净值数据的时间序列回归方法&#xff0c;所需数据较少且操作简单&#xff0c;主要通过基金历史收益率与风险溢价因子收益率进行回归来分析&#xff0c;二是基于持仓数据的归因方法&#xff0…

iis到w3wp的数据流及工作原理

HTTP.sys->IO线程-CLR线程池中的worker线程处理 IO线程只负责把请求交给Worker线程或者放入进程池级别的队列,然后又去HTTP.SYS的队列中处理其它的请求

php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域

大家都知道在一般情况下,一个网站只有一个域名,www.demo.com,但是也有些网站架构是由多个子域名组建的.所以就需要SESSION可以跨子域被 访问到,这样才可以实现用户的跨域登录.就是说客户在A下登录的,同样B也同时登录了,不需要用户再次登录,同时也实现了参数的跨域传递.当然不可…

关于w3wp.exe

一. IIS各版本间的区别 IIS 5.0 IIS 5.1 IIS 6.0 平台 Windows 2000 Windows XP Professional Windows Server 2003 家族 体系结构 32 位 32 位和 64 位 32 位和 64 位 应用程序进程模型 TCP/IP 内核 DLLhost.exe&#xff08;处于中等或高应用程序隔离模式下的多个…

php云解析播放器,xyplay云解析PHPV3.4.1优化稳定版视频解析

演示地址&#xff1a;如有演示站请以演示为准&#xff0c;无演示站以截图为准,源码太多服务器有限&#xff0c;无法搭建所有源码演示站&#xff0c;请谅解&#xff01;新手购买指导&#xff1a;1.在本站注册账号 丨 2.登录已注册账号充值源码所需金币 丨 3.登录账号下载所需源码…

php version.,PHP_VERSION指什么

PHP_VERSION (string)当前的PHP版本&#xff0c;以字符串形式“ major.minor.release [extra]”表示。 (推荐学习&#xff1a;PHP视频教程)例如&#xff1a;<?php // PHP_VERSION_ID 自 PHP 5.2.7 起有效&#xff0c;// 如果我们的版本低于该版本&#xff0c;则用以下代码来…

C# async 和 await 理解

先假设如下场景&#xff1a; 主函数 Main&#xff0c;循环等待用户输入&#xff1b; 计算函数 Cal&#xff0c;耗时计算大量数据&#xff1b; class Test {static int Main(string[] args){while(true){// 等待用户输入}}public static int Cal() {int sum 0;for (int i …

php进阶面向对象及tp5,TP5实战技巧---开发思路 引路造桥

## TP5实战技巧实例---开发思路> 子曰&#xff1a;“学而不思则罔&#xff0c;思而不学则殆。”[TOC]### 利用TP的MVC框架 做快速开发>[success] 写在前面的话:既然选择TP5框架,我推荐大家要通读完全开发手册,我这里并不是要大家记住每一个方法,每一个细节.而是要求大家心…

C# 彻底搞懂async/await

前言 Talk is cheap, Show you the code first&#xff01; private void button1_Click(object sender, EventArgs e) {Console.WriteLine("111 balabala. My Thread ID is :" Thread.CurrentThread.ManagedThreadId);AsyncMethod();Console.WriteLine("222 …

matlab平滑窗滤波,matlab实现平滑滤波

clc;clear;close all;imimread(‘p1.jpg‘);im rgb2gray(im);imdouble(im);imim/max(im(??);figure(‘Name‘,‘原图‘,‘NumberTitle‘,‘off‘);imshow(im,[0,1]);P1 imnoise(im,‘gaussian‘,0,0.005); % adding gaussian noise 这里im是原始图像&#xff0c;添加了均值…