12 2019 档案
摘要:pivot帮助我们实现行转列,pivot出现之前只能通过下列sql实现行转列 转置sql1:查询多次表,性能差 select PaymentType 支付类型 ,count(*) 订单数 ,sum(RealUSDPayTotalPrice) 总支付金额 ,(select count(*) from
阅读全文
摘要:公用表表达式和派生表类似的另一种形式的表表达式,CTE中是先定义表,然后再引用,结构比较清晰 CTE相比派生表的优势:如果有多个子查询,不需要像派生表那样嵌套,只需要在WITH中定义多个CTE,每个CTE可以引用它前面定义的所有CTE 派生表:from子句中的子查询。 select * from (
阅读全文
摘要:使用场景: 得到部门中工资排名前N名的员工列表;查找各部门每人工资占部门总工资的百分比。 对于这些场景,使用传统SQL实现比较困难,这类需求有一个共同特点就是需要在满足某些条件的记录集内部做一些函数操作,不是简单的表连接、聚合就可以实现。 要解决此类问题,最方便的方式就是使用窗口函数。 窗口: 窗口
阅读全文
摘要:加载XML XElement.Load("c:/1.xml"); XElement.Parse("<Persons></Persons>"); 查找元素 var l = from n in root3.Elements() select new Person { ID = int.Parse(n.E
阅读全文
摘要:AsEnumerable() DataTable table = GetTable(); var q = from n in table.AsEnumerable() select new Person { ID=n.Field<int>("ID"), Name = n.Field<string>(
阅读全文
摘要:AsParallel() 并行化操作,大集合使用,提高速度 personList.AsParallel().Sum(p => p.CompanyID); SelectMany() 合并集合的集合成员 Dictionary<int, List<string>> dict = new Dictionar
阅读全文
摘要:这几个方法用于提高编码效率,减少无聊操作。 Enumerable.Empty() 生成一个空集合,用于初始化集合 IEnumerable<int> list = Enumerable.Empty<int>(); Enumerable.Range() 生成指定范围内的整数序列 Enumerable.R
阅读全文
摘要:ToLookup(): linq提供了一个ToDictionary()扩展方法,转换成Dictionary类型 personList.ToDictionary(p => p.CompanyID); key是CompanyID,Value是Person对象。如果CompanyID有重复值,会抛出异常。
阅读全文
摘要:查看源码 vs中F12查看源码:(vs2017、vs2019可以设置,低版本的不清楚) 工具 - 选项 - 文本编辑器 - c# - 高级 - 选中“支持导航到反编译源” 安装静态资源包(LibMan工具) 比如安装jquery、bootstramp 右键项目文件 - 添加 - 客户端库(Clien
阅读全文
摘要:let:在linq中定义变量,可以重复使用 var lowercaseStudentNames = from s in studentList let lowercaseStudentName = s.StudentName.ToLower() where lowercaseStudentName.
阅读全文
摘要:实体 public class Person { public string Name { get; set; } public int CompanyID { get; set; } } public class Company { public int ID { get; set; } } pu
阅读全文
摘要:当一个服务注册多个实现时,如何区分?如果我们一个服务只有一个实现类,直接使用As()即可,但是如果一个服务有多个实现类,如何获取实现类 获取全部实现类 解析时直接使用IEnumerable<服务类型>类型的参数,如下 注册: builder.RegisterType<Cat>().As<IAnima
阅读全文
摘要:# 介绍 DynamicProxy(以下称为动态代理)起作用主要是为我们的类生成一个代理类,这个代理类可以在我们调用原本类的方法之前,调用拦截器以实现AOP。那么动态代理是怎么实现的呢,这里简单一下提一下,这里主要是用了emit技术动态生成IL,相当于在内存中用IL给我们编写了一个Class。 #
阅读全文
摘要:概述 服务的生命周期 服务的生命周期是服务实例在程序中生存的时间。例如您“新建”一个实现IDisposable的对象,然后再对其进行调用Dispose()。 选择正确的生命周期范围将有助于避免组件寿命过长或不够长的俘获依赖和其他陷阱。 开发人员需要为每个应用程序组件做出正确的选择。 服务的范围(作用
阅读全文
摘要:# String类型 value可以是String类型,也可以是数字类型(整数、浮点);当遇到incr、decr等操作就会转换成数值型进行计算,此时redisObject的encoding值为int。 不管哪种类型,底层都是字节数组形式存储,只不过编码方式不同。string类型最大空间不能超过512
阅读全文
摘要:Docker安装Redis 下载镜像 docker pull redis:6.2.6 运行容器 docker run -d --name redis -p 6379:6379 --restart always redis:6.2.6 --requirepass 123456 进入容器,测试redis
阅读全文
摘要:Redis为什么有多个库? Redis默认有16个库,使用select命令切换,Redis中的库和关系型数据库不一样,Redis中的库可以理解为“命名空间”,且不支持独立密码。Redis多数据库目的是为了对数据隔离,防止key冲突。 Redis为什么速度快? 1、完全基于内存,绝大部分请求是纯粹的内
阅读全文
摘要:对于本地的验证方案,我们可以很容易了解验证过程。但是远程的验证方案是特殊的,我们往往会单独来处理它,就像下方的中间件代码,您会发现会优先判断是否为远程验证,然后再执行本地验证。 // 判断当前是否需要进行远程验证,如果是就进行远程验证 var handlers = context.RequestSe
阅读全文
摘要:注册服务 在Startup.ConfigureServices执行services.AddAuthentication() services.AddAuthentication() 注册如下服务,便于理解省略了部分辅助服务 services.TryAddScoped<IAuthenticationS
阅读全文
摘要:AuthenticationOptions(整个应用的身份验证选项) AuthenticationSchemeOptions是指某个具体身份验证方案的选项。AuthenticationOptions则是针对整个身份验证功能的选项对象,我们需要在应用启动阶段通过它来配置身份验证功能。 Authenti
阅读全文
摘要:概述 目的是使全文检索变得简单,能够达到实时搜索,稳定,可靠,使用简单方便 ES是一个基于Lucene构建的搜索引擎,隐藏了 Lucene 的复杂性。 分布式、易扩展、高可用、高实时的搜索与数据分析引擎 基于RESTful web接口 它用 Java 编写的 易扩展:指的是增加服务器节点,ES会分片
阅读全文
摘要:Action返回类型 特定类型 返回类型是特定类型,状态码是200,如果想返回其他的HTTP状态码类型,只能设置ResponseStatusCode,不优雅 public Person Person1([FromQuery] int id = 1) { if (id != 1) { Response
阅读全文
摘要:模型绑定 什么是模型绑定?简单说就是将HTTP请求参数绑定到程序方法入参上,该变量可以是简单类型,也可以是复杂类。 绑定源 所谓绑定源,是指用于模型绑定的值来源。 [FromQuery]:从Url的查询字符串中获取值。查询字符串就是Url中问号(?)后面拼接的参数 [FromRoute]:从路由数据
阅读全文
摘要:REST REST全称是Representational State Transfer 表述性状态传递。REST可能是现在最流行的一种Web API。 REST的核心就是资源,一个资源就是可以被标识的实体,它有名称和地址。 REST API就是把数据以资源的形式暴露出来,并使用标准的HTTP方法来代
阅读全文
摘要:介绍 WebAPI用来开发系统间接口的技术,基于HTTP协议,返回默认是json格式。比wcf简单 更通用,更轻量级,更省流量(json格式); WebAPI尽可能复用MVC路由、ModelBinder、Filter等知识,但只是模仿 webapi默认路由机制是通过http请求类型匹配Action(
阅读全文
摘要:.net中的MemoryCache是通过内部封装一个静态Dictionary 自己写一个缓存,支持过期时间 来看看内部怎么实现的 public class CustomerCache : ICache { private static ConcurrentDictionary<string, Key
阅读全文
摘要:继承ISerializable接口可以灵活控制序列化过程 格式化器的工作流程:格式化器再序列化一个对象的时候,发现对象继承了ISerializable接口,那它就会忽略掉类型所有的序列化特性,转而调用类型的GetObjectData方法来构造一个SerializationInfo对象。 我们在方法G
阅读全文
摘要:implicit和explicit是一对转换操作符 Implicit关键字:用于声明隐式的用户定义类型转换运算符。它可以实现2个不同类的隐式转换 ,提高代码的可读性。 Explicit关键字:声明必须通过转换来调用的用户定义的类型转换运算符。不同于隐式转换。 1 public class Peopl
阅读全文
摘要:概述 注册: 注册就是将组件注册到容器,并指定暴露那些服务 默认暴露自身,也可以使用As()暴露其他服务,但请注意, 一旦你将组件暴露为一个特定的服务, 默认的服务 (组件类型) 将被覆盖. 解析: 在注册完组件并暴露相应的服务后, 你可以从容器或其子生命周期中解析服务. 推荐从子声明周期中解析服务
阅读全文
摘要:前言 在线程执行的地方使用try..catch..捕获不到异常 首先,线程内部不应该出现异常,所以首选处理方式是在Task中使用try..catch..把异常处理掉 Task中可能会抛出多个异常,应该使用AggregateException捕获多线程中所有异常。AggregateException是
阅读全文
摘要:简介 TaskCompletionSource生成Task的另一种方法.使用TaskCompletionSource很简单,只需要实例化它即可。TaskCompletionSource有一个Task属性,你可以对该属性暴露的task做操作,比如让它wait或者ContinueWith等操作。当然,这
阅读全文
摘要:简介 Task(任务)可以解决多线程编程中的复杂性。 多线程编程的复杂性 传递数据和返回结果 传递数据倒是没啥问题,只是难以获取到线程的返回值,处理线程的异常也需要技巧。 监控线程的状态 新建新的线程后,如果需要确定新线程在何时完成,需要自旋或阻塞等方式等待。 线程安全 设计时要考虑如果避免死锁、合
阅读全文
摘要:概念 信号 有时候你需要让线程处于等待状态,直到接收其他线程发来的消息,这就叫发送信号(signaling) 最简单的发送信号的方式就是使用ManualResetEvent。调用它的WaitOne()方法阻塞线程,调用Set()方法开启信号 临界区 一段代码内如果存在对共享资源的多线程读写操作,那么
阅读全文
摘要:设计模式分类 创建型设计模式 关注对象的创建,new的花样就有很多 单例模式 工厂模式 工厂方法模式 原型模式 建造者模式 结构型设计模式 结构型设计模式关注类与类之间的关系,其实就是折腾组合与继承,(组合优于继承),为程序提供更好的灵活性和扩展性。 结构型设计模式本质是一样的,都是包一层,只不过招
阅读全文
摘要:数组型: Array:内存连续分配,长度不可变,可索引访问。 ArrayList:早期版本使用,非泛型,类型不安全,如果元素数据类型不同可考虑使用。 List<>:泛型,可变长度,内存连续分配,只要内存是连续分配的都可以使用索引访问。 以上三种数据类型都是内存连续的,所以可以使用索引访问,增删改慢,
阅读全文
摘要:反射获取泛型类、泛型方法 1 using System; 2 using System.Reflection; 3 4 namespace RFTest 5 { 6 //类ReflectionTest中定义了一个泛型函数DisplayType和泛型类MyGenericClass 7 class Re
阅读全文
摘要:只是演示反射的用法,使用反射的方式性能不好,可以使用表达式树的方式做对象映射。查看Linq分类里有相关文章 Mapper: public class Mapper { private static ConcurrentDictionary<Type, PropertyInfo[]> PROPTY_C
阅读全文
摘要:public enum EJobType { 客服 = 1, 业务员 = 2, 财务 = 3, 经理 = 4 } Type jobType = typeof(EJobType); 方式1: Array enumItems = Enum.GetValues(jobType); foreach (var
阅读全文
摘要:介绍 IEnumerable 提供了可以迭代的能力,而这种能力是通过内部的可迭代对象来实现了,这个对象就是IEnumerator 有了它们,我们不需要将内部集合暴露出去,外界只需要访问我的迭代器接口方法即可遍历数据。 foreach 在C#中,使用foreach语句来遍历集合。foreach语句是微
阅读全文
摘要:IConvertible接口:定义特定的方法,这些方法将实现引用或值类型的值转换为具有等效值的公共语言运行库类型。 C#中一个很好用的函数是Convert.ChangeType,它允许用户将某个类型转换成其他类型。但是如何你需要转换的对象不是继承自IConvertible接口,那么系统会抛出异常,转
阅读全文
摘要:C#中,自定义类型,支持比较和排序,需要实现IComparable接口。IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表示当前对象大于被比较对象,0表示两者相等,-1表示当前对象小于被比较对象。 IComparable接
阅读全文