2023年6月21日发(作者:)

.NET和NETCORE100道基础⾯试题1.⾯向对象的语⾔特性?A:封装性、继承性、多态性。2.在.NET中所有类的基类是?A:Object。3.在C#中,&和&&的区别?A:&是按位与运算符(或取地址运算符),&&是条件与运算符(也叫逻辑与运算符)。4.委托声明的关键字是?A:delegate。5.在.NET中所有可序列化的类都被标记为?A:Serializable。6.⼀个类不想被继承应该?A:标记为sealed。7.简单描述CLR?A:CLR(Common Language Runtime公共语⾔运⾏时)类似于java的JVM虚拟机。.NET平台的程序会运⾏在CLR上,CLR⾃动进⾏资源分配和垃圾回收,某种程度上分离了系统和应⽤。8.如何对数组的元素进⾏倒序排列?A:()后e()。定义的基本的与服务器交互的⽅法有?A:4种,分别是:GET获取、POST新建(也可以更新)、PUT更新、DELETE删除。10.单点登录常⽤的实现⽅法有?A:1. 存放⽤户凭证在Cookie中,但是依赖Cookie不太安全⽽且⽆法跨域2. 使⽤jsonp,和cookie差不多,虽然能解决跨域但加密算法泄露还是不安全3.

token,现在⽐较常见的⽅式,通过反复重定向来验证,因为所有信息都存在服务端,所以即使知道了加密算法也⽆法登录,⽐较安全。但是项⽬调⽤⽐较复杂。11.什么是继承?什么是重载?A:继承指⼦类可以拥有⽗类允许访问的属性、⽅法等。重载是⼀个函数通过参数类型或者数量区分不同的实现。12.什么是接⼝类?A:定义了⼀组⾏为的集合,其中的⽅法不能有具体实现。13.什么是虚函数?什么是抽象函数?A:虚函数是⼦类可以被override的(也可以不)函数,在⽗类中必须实现。抽象函数必须存在于抽象类中,不允许有具体实现,它的⼦类必须实现该⽅法(有点像接⼝中的⽅法)14.在页⾯之间传递值除了Session、Cookie、Application,还有什么其他⽅法?A:QueryString,POST,ViewData(基于字典),ViewBag(基于Dynamic)中常⽤的对象有哪些,其作⽤分别是什么?A:SqlConnection连接数据库,SqlCommand执⾏sql语句,SQLDataAdapter查询数据后填充到DataSet,DataSet中包含DataTable存放数据。16.什么是SQL注⼊,如何防⽌SQL注⼊攻击?A:代码没有过滤特殊字符时,在执⾏sql语句处填⼊';等之类的字符来截断sql语句后再输⼊要执⾏的sql语句(删表等)来对数据库进⾏攻击。可以使⽤SQLParameter(把所有参数当字符串⽽不是关键字来处理)或者ORM来避免。17.使⽤递归输出斐波那契数列,并输出第X项。A:int fb(int i){ if(i<1) return 0; else if(i<=2) return i; else return fb(i-1)+fb(i-2);}18.将字符串逆序输出为””。A:ine((".", (".").Reverse()));19.原⽣js的ajax?A:em..........20.在SQL环境下,写⼀个T-SQL函数,求从今天往后数的7000天,所在⽇期的当⽉有多少天?A:declare @date_time datetime,@day_num int,@d intset @date_time=dateadd(d,7000,getdate())set @d=month(@date_time)if @d=12set @day_num=31elseset @day_num=day(dateadd(d,-1,(cast(year(@date_time) as varchar(4))+'-'+cast((month(@date_time)+1) as varchar(2))+'-01')) )select @day_num as count,@d as month,@date_time⽹上抄的21.写⼀个存储过程,可以清空任意⼀个表的数据?A:create proc deltb@tname char(20) --⼊参asdeclare @cmd char(50)='truncate table '+@tnameexec(@cmd)exec deltb '表名'22.请列出UML中⼏种视图的名称,并解释其中两种视图的作⽤?A:em...............23.请描述设计模式的含义,并写出你所了解的⼏中设计模式的名称?A:通过⾯向对象特性更好的解耦代码,⽤过单例和⼯⼚。24.如何部署⼀个项⽬?A:VS发布到⽂件夹,拷到服务器上,IIS指定⽬录并绑定IP(域名)。25.写出验证中国移动⼿机号码的正则表达式?A:1d{10} (不知道中国移动的开头是啥)26.如何在所有页⾯加载时输出内容?A:使⽤HTTPModule/中间件或者Filter。27.什么是串⾏化?A:将数据使⽤BinaryFormat从Stream保存到⼆进制⽂件,这种⽂件⼤⼩都是2的X次⽅。28.⽤⼀个xml⽂件描述你⾃⼰?A: 姓名 2429.判断⼀个字符串中出现次数最多的字符,并统计这个次数?A:遍历字符串,创建字典,以char为key,value默认1,如果字典key中包含char则value+1。最后输出字典30.什么是装箱和拆箱?A:值类型到object是装箱,object到值类型是拆箱31.C#中委托是什么?事件是不是⼀种委托?A:委托是传递⼀个⽅法的引⽤,类似函数指针。事件是⼀种特殊的委托。de和重载的区别?A:override是重写⽅法的关键字,重载指⼀个⽅法的不同实现。33.什么叫应⽤程序域?A:就是程序之间的边界,可以理解⼀个程序是⼀个应⽤程序域。34.什么是不受管制的代码?A:unsafe关键字⾥写的⾮托管代码。不经过CLR运⾏。可以写指针等骚操作。 str = null和string str = “”的区别?A:null表⽰不存在于内存中没有地址,“”表⽰存在于内存中的“”这个对象36.描述class和struct异同?A:class是引⽤类型放在堆上的,struct是值类型放在栈上的。37. 能⽤foreach遍历访问的对象需要实现_____接⼝或声明_____⽅法的类型。A:IEnumerable接⼝、GetEnumerator()⽅法是什么?为什么需要GC?A:GC(Garbage Collector)是垃圾收集器。.net中垃圾收集器会⾃动对内存垃圾进⾏回收管理,因为有了CLR的GC机制。正常情况下,.net会⾃动的帮忙释放内存,如果⾮托管代码,则需要⼿动释放,⽐如dataread、WebRequest。39.接⼝可否继承接⼝?抽象类可否实现接⼝?抽象类可否继承实体类?A:接⼝可以继承接⼝。抽象类可以实现接⼝。抽象类可以继承实体类 (但是实体类必须有可访问的构造函数,所有类都⽆法继承只有private构造函数的实体类)。⾥有⼀个return语句,那么finally中的代码会不会执⾏,在return前还是return后?A:会,在return前执⾏。看反编译会发现finally的代码放在了函数出⼝之前。41.两个对象值相同(y)==true,但可能有不同的hash code,这个说法对吗?A:==⽐较地址,equals⽐较值*(等⽐地址Equals值)*。两个对象值相同则表⽰拥有相同的HashCode。42.进程和线程的区别?A:进程是系统进⾏资源分配和调度的单位;线程是CPU分配和调度的单位。⼀个进程可以有多个线程,这些线程共享这个进程的资源。(进程是系统层⾯,线程是CPU层⾯。线程∈进程)43.堆和栈的区别?A:栈上放的是由编译器⾃动分配释放的资源。堆上放的是代码中⾃⼰分配释放的资源,⽐如new对象时分配的内存空间。44.请指出GAC的含义?A:(Global Assembly Cache)全局程序集缓存。应该是指常⽤到的dll(⽐如,tions)会缓存在windows⼀个指定的⽂件夹下,别的程序再使⽤的话就直接调⽤,不⽤重新加载了。em…没折腾过。ader和DataSet有什么区别?A:DataReader是读取数据库的(游标类似)。DataSet是⽤来存放数据的。46.软件开发⼀般有⼏个阶段?每个阶段的作⽤?A:需求分析,详细设计(架构设计),代码编写,测试,部署```47.什么是强类型?什么是弱类型?哪种更好?为什么?A:需要在编译时定义变量类型的是强类型,⽐如User user= new User();不需要指定类型的为弱类型如js

var user={};好坏看业务需求,各有千秋。48.什么是反射?A:在程序运⾏时动态获取程序集信息:接⼝、类、⽅法、属性等。49.编程求从0-1000⼀共输出了多少个0?需要JS和C#?A:em.........抖个机灵,js参照这个。var str = "";```for (int i = 0; i < 1000; i++){ str += ng();}ine(('0').Length-1);50.表如下:⽤⼀条SQL语句显⽰如图的结果?表1:| id | department || :------| :------ || 1 | 设计 || 2 | 市场 || 3 | 售后 |表2:| id | dptID | name || :------| :------ | :------ || 1 | 1 | 张三 || 2 | 1 | 李四 || 3 | 2 | 王五 || 4 | 3 | 彭六 || 5 | 4 | 陈七 || 6 | 5 | 陈七 |结果:| id | dptID | department | name || :------| :------ | :------ | :------ || 1 | 1 | 设计 | 张三 || 2 | 1 | 设计 | 李四 || 3 | 2 | 市场 | 王五 || 4 | 3 | 售后 | 彭六 || 5 | 4 | ⿊⼈ | 陈七 |A:**isnull(列名,'指定值')可以使⽤coalesce(列名,'指定值')替换,结果⼀样**select min() as id,

min() as dptID,

isnull(ment,'⿊⼈') as department,

from users as u left join dpt as d on =p by name,department

order by 中lock关键字根据什么来产⽣边界(线程同步)?A:静态变量。(static object o=new Object();)52.在.NET中引⼊ref和out关键字的根本原因是什么?A:⽅法中操作的对象的地址和传⼊的参数地址不⼀致。ref修饰的变量在⽅法中改变值时候,实际参数也会改变。中的new关键字和override关键字的异同?A:要重写的⽅法都需要virtual关键字,但是override是重写了⽗类的⽅法,调⽤的话是⼦类重写后的⽅法;new是重新写了⼀个同名的⽅法,隐藏了⽗类的⽅法。如果把⼦类强制转换为⽗类的话new调⽤还是⽗类的⽅法,⽽override则调⽤⼦类重写的⽅法。:.NET MVC框架是通过什么来解析HTTP请求的。A:请求的method。。。。(⼀时半会没理解)5实质是?A:⼀种哈希(hash)散列算法。将字符串转换为字节数组后计算数组的hash值。55.分布式分类?A:1. 应⽤分布式:程序部署在多台机器上2. 缓存分布式:缓存部署在多台机器上3. 数据库分布式:数据库部署在多台机器上我当时就这么瞎⼏把回答的56.后台接⼝如何鉴权?⽐如开发了⼀个后台管理系统,如何防⽌别⼈拿到你请求的接⼝恶意攻击?A:OAuth使⽤accessToken访问。或者使⽤JWT57.纯webapi项⽬,前端请求的⽤户信息存储在哪⾥?A:web的话localStorage。不同端有不同的存储⽅式。⽣命周期?A:四种两类。(vue对象)创建前/后,挂载前/后(vue挂载到页⾯),更新前/后,销毁前/后。59.多线程的线程同步如何实现?A:1. 使⽤Monitor/lock关键字创建临界区2. 读写锁static private ReaderWriterLock _rwlock = new ReaderWriterLock();

//

请求读锁,如果10ms超时退出

_eReaderLock(10);

//...读取数据_eReaderLock(); //释放读锁//

请求写锁,如果100ms超时退出

_eWriterLock(100);

//...写⼊数据_eWriterLock(); //释放写锁3. 系统级别的:信号量(Semaphore),互斥(Mutex),事件(AutoResetEvent/ManualResetEvent) 。线程池1. 信号量(Semaphore)://当前允许同时访问线程数2;

最⼤允许数量=3

static Semaphore s = new Semaphore(2, 3);

static void Main(string[] args){ for (int i = 0; i < 10; i++) new Thread(Go).Start(); ne();}static void Go(){ while (true) { //WaitOne()和Release()必须成对出现,否则会⼀直等待/释放出错 e(); (1000); //因为当前数量为2,所以每sleep后输出2⾏

ine(dThreadId); e(); }}2. 互斥(Mutex):var _mtx = new Mutex();var _resource = new List();//

设置超时时限并在wait前退出⾮默认托管上下⽂

if (_e(1000, true)){ _("123"); _eMutex(); //WaitOne和ReleaseMutex必须成对出现, //否则会导致进程死锁的发⽣,会抛出AbandonedMutexException异常。}3. 事件(AutoResetEvent/ManualResetEvent)//处理线程等待的对象//false是⼿动set唤醒,如果传true则会在线程执⾏时⾃动setstatic EventWaitHandle wh = new AutoResetEvent(false);static void Main(){ new Thread(Waiter).Start();//1 new Thread(Waiter).Start();//2 new Thread(Waiter).Start();//3 (3000); //做任何耗时操作 //唤醒,继续执⾏刚才第⼀个线程输出,然后再⾃动挂起 ();

//再次唤醒会执⾏第⼆个线程输出,然后再⾃动挂起,AutoResetEvent是按顺序来的 //⽽ManuelResetEvent则在执⾏Set()后释放了所有挂起的线程 //();

y();}static void Waiter(){ ine(""); e(); //等待唤醒之后继续往下执⾏ //AutoResetEvent和ManuelResetEvent相⽐相当于⾃动执⾏了这⾏ //();

ine("Notified");}ManualResetEvent与AutoResetEvent区别是M的Set()⽅法⼀次释放所有挂起的线程,A在Set()之后⼜⾃动将后续线程挂起,需要再次Set()。A相当于M在WaitOne()之后执⾏()4. 线程池(em…暂时看不懂搜出来的东西⼤数据并发(例如秒杀活动,放到redis时并发怎么处理)?A:为redis加锁,别的进程判断如果锁存在则等待,直到锁被释放(通过时间戳等机制优化解决死锁)ached(与redis区别)、UML⽤过吗?A:⽤过Memochached,与redis的区别是redis有机制不是所有数据都放在内存中,会放磁盘⼀部分(重启不丢失)。redis⽀持更多数据类型(list,set,zset,hash),redis是单线程。Memcached单个value最⼤只⽀持1MB,Redis最⼤⽀持512MB。UML没⽤过。62.数据库锁了解过吗?A:共享(S)锁、排它(X)锁、更新(U)锁。避免脏读?A:我们只需要在实体中增加⼀个byte[]类型的字段,并为其加上[Timestamp]特性:public class Entity{ public string Name {get; set;} [Timestamp] public byte[] v {get; set;}

}这样在更新或删除操作⽣成的Sql中,Where语句将包含

and v = @2 条件,如果有其它⽤户更改过此⾏,那么⾏版本将不⼀致,因此更新或删除sql会⽆法找到要更新的⾏,此时EF将认定该操作出现了并发冲突。如果是控制某个列的并发,将ConcurrencyCheck特性添加到实体需要控制并发的⾮主键属性上即可。64.什么是事务?A:数据库的⼀种机制,在开启事务之后的操作中(如果发⽣了业务异常)可以将数据库回滚到开启事务之前的状态。65.说说你知道的数据库优化⽅式?A:1. 建⽴索引2. 使⽤存储过程3. 使⽤视图4. 优化查询语句66.数据库索引使⽤需要注意什么?什么是视图?如何做查询优化?A:1. ⼀个表内索引最好不要太多,⼀般在主键和经常做where条件或者group by或者order by的列上创建索引,如果表数据太⼩索引反⽽会影响性能。2. 视图是由⼀张或多张表联合查询出的虚拟表,复杂查询使⽤视图来代替联表查询会提升性能。3. 查询语句优化⼀般尽量避免全表扫描,以下⼏点会全表扫描:1. 使⽤null判断,会全表扫描。2.

<>(不等于)判断,会全表扫描。3. 使⽤or,会全表扫描。4. 左右模糊查询%xx%,会全表扫描。5. 尽量使⽤exists代替in,in会全表扫描。6. 尽量不要在where语句中判断运算后的结果,会全表扫描。67.什么是跨域?如何解决跨域问题?管道模型是什么?HttpHandler是什么?HttpModule是什么?中间件是什么?A:1. Http管道模型是指⼀个请求⼀层⼀层达到action,然后再⼀层⼀层出去的过程像个管道⼀样。2.

HttpHandle是ISAPI的aspnet_通过后缀名然后转发到不同的处理程序。⽐如.aspx会调⽤ndler处理页⾯。3.

HttpModule是请求在管道中经过的模块,可以⾃⾏编写实现⾝份认证、过滤器等功能。4. 中间件类似于HttpModule,也是在请求在管道中经过的模块,区别是HttpModule基于事件。(我是这么答的)69.堆栈区别?A:堆上存放引⽤类型数据,需要⼿动开辟内存空间(new的时候)。栈上存放值类型数据,不需要⼿动开辟内存空间。70. 数组是否值类型?A:数组都是引⽤类型,继承⾃,⽽Array继承⾃,众所周知值类型都是继承ype的。71.数组扩展长度内存操作原理 ?A:(这个⾯试官问的我到现在还没有理解他想问什么?可能是想问List在Add时候的扩容过程)如果有⼈问数组扩容或者List在Add时超出长度在内存中的过程就回答:如果新添加的元素超出数组长度则new⼀个更⼤的数组将原来数组copy过去。72.数组和集合区别 ?A:数组声明时是定长的,且声明类型⽐如int[5],内存上是连续存储的。集合则可以⼀直添加元素,声明时不⼀定声明类型(使⽤泛型)⽐如List。73.a="123"; b="123";内存怎么分布,b=a时呢?A:1.

“123”由于CLR的字符串驻留机制只存有⼀份。所以当a="123";b="123";时a和b都指向了"123"这个字符串的引⽤。2. 当b=a时是把a的引⽤copy了⼀份给b。74.分布式锁原理?A:通过某种⽅式加⼀把锁,让分布式程序执⾏⽅法时获取锁,保证 同⼀个⽅法同⼀时刻只能被⼀台机器上的⼀个线程访问。⼀般实现有:1. 通过数据库实现(加⼀条记录去读取之类的)。2. 通过redis实现。3. 通过Zookeeper(不知道是啥)。五种数据类型?A:1.

string2.

hash3.

list(值不唯⼀,可以通过pop实现简单消息队列)4.

set(值唯⼀)5.

MQ中交换机的理解?A:消息(Message)由Client发送,RabbitMQ接收到消息之后通过交换机转发到对应的队列上⾯。Worker会从队列中获取未被读取的数据处理。RabbitMQ包含四种不同的交换机类型:1.

Direct exchange:直连交换机,转发消息到routigKey指定的队列2.

Fanout exchange:扇形交换机,转发消息到所有绑定队列(速度最快)3.

Topic exchange:主题交换机,按规则转发消息(最灵活)4.

Headers exchange:⾸部交换机 (未接触)(抄的,只跑过收/发消息的demo)和readonly的区别?A:const是编译时定好⽆法改变的。readonly归根结底还是对象中的属性,是动态的,只不过修饰为只读⽽已。78.扩展⽅法是动态还是静态?怎么写扩展⽅法?A:扩展⽅法是静态的,只能存在于静态类中。写法跟函数差不多,第⼀个参数必写为this 要扩展的类型

xxx,然后xxx则是调⽤扩展⽅法的对象本⾝,⽐如扩展⼀个string类的⽅法:static void Output(this string str){ ine(str); //"123".Output();

执⾏后会输出123, //str对象就是调⽤⽅法的"123"字符串}相关理解?A:接⼝IA定义业务⽅法,A具体实现IA。通过IOC将实现类A注⼊到IA中,这样调⽤时虽然看起来是IA.⽅法(),其实执⾏的是实现类中的⽅法。实现了⾯向接⼝编程,降低对实现类的耦合。的理解和认识?什么是失⾎/贫⾎/充⾎/胀⾎模型?A:可以通过聚合、实体等概念梗清晰的描述业务,底层的CQRS(读写分离)、UOW(UnitOfWork,⾃动实现事务)、仓储层都很好⽤。1. 失⾎模型:领域模型只有get/set。没有任何实体业务逻辑,完全依赖service->DAL->domain调⽤。2. 贫⾎模型:领域模型除了get/set后包含⼀些简单的实体组装逻辑,还是依赖service->DAL->domain调⽤。3. 充⾎模型:领域模型包含DAL层的东西⽐如持久化,调⽤变为service->domain->DAL4. 胀⾎模型:取消service层,直接通过domain->DAL来调⽤执⾏业务(⾎越多领域层越复杂,对service层依赖越⼩)81. NET4.5 / 4.6以及历史版本的区别?A:.NET 3.0 引⼊WPF、WCF、WF。使⽤CLR 2.0,对应C# 3.0;.NET```3.5 引⼊Linq、EF、扩展⽅法、特性、Lambda。使⽤CLR 2.0,对应C# 3.0;.NET 4.0 增加了并⾏的⽀持。使⽤CLR 4.0,对应C# 4.0;.NET 4.5 增加了Task异步编程模型(async/await)。使⽤CLR 4.0,对应C# 5.0;.NET 4.6 优化(好像同时发布/引⼊了 Core)。使⽤CLR 4.0,对应C# 6.0;.NET 4.6.2 对应C#7.082. SqlServer使⽤SQL分页怎么实现?A:1. select top 页⼤⼩ from x where id not in(select top 页⼤⼩x(页码-1) id from x) 不推荐使⽤因为in会造成全表扫描。2.

select * from ( select *,ROW_NUMBER() OVER(order by id) as RowId from x) as twhere between 页⼤⼩x(页码-1) and 页⼤⼩x页码3.

--⽀持SQLSERVER 2012+的版本SELECT *

FROM x

ORDER BY id

OFFSET 页⼤⼩x(页码-1) ROWS --有点像Linq的Skip(x) FETCH NEXT 页⼤⼩ ROWS ONLY; --然后Take(x)ameter的原理?A:把所有参数当字符串⽽不是关键字来处理。84. IIS应⽤程序池经典模式和集成模式区别?A:经典模式:兼容IIS6.0,继续通过C盘下aspnet_来处理请求。集成模式:使⽤IIS和的集成请求处理管道来处理请求。85.如何全局处理异常?A:使⽤中间件记录处理异常,或者使⽤ExceptionFilter来捕获全局异常。86.说说Webapi的restful风格的了解?post和put的区别?A:对同⼀个接⼝地址通过不同的请求Method编写不同的逻辑。⼀般包括四种:1. get:查询2. post:添加3. put:更新4. delete:删除因为put⼀般代表更新操作,所以是幂等的,更新⼀万次对象还是存在。⽽post则不是幂等的,多次post会创建多个数据。87.:nuget包上传管理流程?A:1. nuget官⽹下载2. cmd```命令:nuget pack⽣成⽂件3. 登录nuget官⽹创建⼀个密钥4. cmd命令:nuget push 密钥 -Source /v3/5. 上传完成,可在VS中搜索到88.简述.NET CORE中IOC⽣命周期?A:1.

Transient(瞬间的):每次使⽤(获取这个服务的时候)时都会创建新的服务,适合轻量级的服务。2.

Scoped(作⽤域的):在同⼀次请求中只存在⼀次的服务。3.

Singleton(唯⼀的/单例的):全局只创建⼀次的服务,第⼀次被请求的时候被创建,然后就⼀直使⽤同⼀个。89.简述.net core中间件?A:中间件是在管道中处理请求的组件,处理完后可以传递给下⼀个组件。通过在Startup类的Configure⽅法中使⽤Use来使⽤中间件并可以调整顺序。.NET CORE中使⽤RequestDelegate来构建管道模型,所以⾃定义的中间件需要根据约定来实现,注意有三点:1. 中间件内要定义⼀个只读的RequestDelegate类型的变量作为调⽤下⼀个中间件的委托。2. 构造函数中要定义RequestDelegate类型的参数并赋给类⾥的变量,IOC会将请求注⼊进来。3. 定义⼀个Task类型的名为Invoke的函数,参数为HttpContext,在其中写中间件的逻辑,并在最后记得返回类中的RequestDelegate对象,传递HttpContext。.NET CORE会⾃动执⾏Invoke⽅法。public class RequestCultureMiddleware{ private readonly RequestDelegate _next; public RequestCultureMiddleware(RequestDelegate next) { _next = next; } public Task Invoke(HttpContext context) { //在这⾥可以对请求的上下⽂做操作如验证之类 //调⽤管道中的下⼀个中间件,向下传递 return this._next(context); }}⾏转列,实现效果如下的操作?数据表:| name | s```ubject | score || :------| :------ | :------ || 张三 | 语⽂ | 80 || 张三 | 数学 | 70 || 张三 | 英语 | 60 || 李四 | 语⽂ | 90 || 李四 | 数学 | 80 || 李四 | 英语 | 70 |转换为:| name | 语⽂ | 数学 | 英语 || :------| :------ | :------ | :------ || 张三 | 80 | 70 | 60 || 李四 | 90 | 80 | 70 |A:SqlServer中有PIVOT(旋转)关键字,PIVOT 后跟⼀个聚合函数来拿到结果,FOR 后⾯跟的科⽬是我们要转换的列(列转⾏使⽤UNPIVOT):SELECT *FROM tPIVOT ( SUM(score) FOR subject IN (语⽂, 数学, 英语))--SqlServer 2005+的版本附⼀个MySql版本:SELECT name SUM(IF(cource="语⽂", score, 0)) AS "语⽂", SUM(IF(cource="数学", score, 0)) AS "数学", SUM(IF(cource="英语", score, 0)) AS "英语"FROM tGROUP BY

group分组,having怎么⽤?A:跟在Group后⾯,像where⼀样使⽤,来筛选分组后的数据。⽐如:select sum(score) as s, name from x group by name having sum(score)>200--根据姓名分组后计算总分,并筛选总分⼤于200分的数据90.去除字符串中连续空格,多个空格变为⼀个?A:使⽤正则匹配之后替换:str = Regex("[s]+").Replace(str, " ");91.泛型的内部机制?A:以List为例,第⼀次编译时只是为T⽣成⼀个占位符。在实际⽤到时⽐如List时,JIT(Just-In-Time即时编译器)会⽤User去代替T的占位符实例化User,以此来实现泛型。

2023年6月21日发(作者:)

.NET和NETCORE100道基础⾯试题1.⾯向对象的语⾔特性?A:封装性、继承性、多态性。2.在.NET中所有类的基类是?A:Object。3.在C#中,&和&&的区别?A:&是按位与运算符(或取地址运算符),&&是条件与运算符(也叫逻辑与运算符)。4.委托声明的关键字是?A:delegate。5.在.NET中所有可序列化的类都被标记为?A:Serializable。6.⼀个类不想被继承应该?A:标记为sealed。7.简单描述CLR?A:CLR(Common Language Runtime公共语⾔运⾏时)类似于java的JVM虚拟机。.NET平台的程序会运⾏在CLR上,CLR⾃动进⾏资源分配和垃圾回收,某种程度上分离了系统和应⽤。8.如何对数组的元素进⾏倒序排列?A:()后e()。定义的基本的与服务器交互的⽅法有?A:4种,分别是:GET获取、POST新建(也可以更新)、PUT更新、DELETE删除。10.单点登录常⽤的实现⽅法有?A:1. 存放⽤户凭证在Cookie中,但是依赖Cookie不太安全⽽且⽆法跨域2. 使⽤jsonp,和cookie差不多,虽然能解决跨域但加密算法泄露还是不安全3.

token,现在⽐较常见的⽅式,通过反复重定向来验证,因为所有信息都存在服务端,所以即使知道了加密算法也⽆法登录,⽐较安全。但是项⽬调⽤⽐较复杂。11.什么是继承?什么是重载?A:继承指⼦类可以拥有⽗类允许访问的属性、⽅法等。重载是⼀个函数通过参数类型或者数量区分不同的实现。12.什么是接⼝类?A:定义了⼀组⾏为的集合,其中的⽅法不能有具体实现。13.什么是虚函数?什么是抽象函数?A:虚函数是⼦类可以被override的(也可以不)函数,在⽗类中必须实现。抽象函数必须存在于抽象类中,不允许有具体实现,它的⼦类必须实现该⽅法(有点像接⼝中的⽅法)14.在页⾯之间传递值除了Session、Cookie、Application,还有什么其他⽅法?A:QueryString,POST,ViewData(基于字典),ViewBag(基于Dynamic)中常⽤的对象有哪些,其作⽤分别是什么?A:SqlConnection连接数据库,SqlCommand执⾏sql语句,SQLDataAdapter查询数据后填充到DataSet,DataSet中包含DataTable存放数据。16.什么是SQL注⼊,如何防⽌SQL注⼊攻击?A:代码没有过滤特殊字符时,在执⾏sql语句处填⼊';等之类的字符来截断sql语句后再输⼊要执⾏的sql语句(删表等)来对数据库进⾏攻击。可以使⽤SQLParameter(把所有参数当字符串⽽不是关键字来处理)或者ORM来避免。17.使⽤递归输出斐波那契数列,并输出第X项。A:int fb(int i){ if(i<1) return 0; else if(i<=2) return i; else return fb(i-1)+fb(i-2);}18.将字符串逆序输出为””。A:ine((".", (".").Reverse()));19.原⽣js的ajax?A:em..........20.在SQL环境下,写⼀个T-SQL函数,求从今天往后数的7000天,所在⽇期的当⽉有多少天?A:declare @date_time datetime,@day_num int,@d intset @date_time=dateadd(d,7000,getdate())set @d=month(@date_time)if @d=12set @day_num=31elseset @day_num=day(dateadd(d,-1,(cast(year(@date_time) as varchar(4))+'-'+cast((month(@date_time)+1) as varchar(2))+'-01')) )select @day_num as count,@d as month,@date_time⽹上抄的21.写⼀个存储过程,可以清空任意⼀个表的数据?A:create proc deltb@tname char(20) --⼊参asdeclare @cmd char(50)='truncate table '+@tnameexec(@cmd)exec deltb '表名'22.请列出UML中⼏种视图的名称,并解释其中两种视图的作⽤?A:em...............23.请描述设计模式的含义,并写出你所了解的⼏中设计模式的名称?A:通过⾯向对象特性更好的解耦代码,⽤过单例和⼯⼚。24.如何部署⼀个项⽬?A:VS发布到⽂件夹,拷到服务器上,IIS指定⽬录并绑定IP(域名)。25.写出验证中国移动⼿机号码的正则表达式?A:1d{10} (不知道中国移动的开头是啥)26.如何在所有页⾯加载时输出内容?A:使⽤HTTPModule/中间件或者Filter。27.什么是串⾏化?A:将数据使⽤BinaryFormat从Stream保存到⼆进制⽂件,这种⽂件⼤⼩都是2的X次⽅。28.⽤⼀个xml⽂件描述你⾃⼰?A: 姓名 2429.判断⼀个字符串中出现次数最多的字符,并统计这个次数?A:遍历字符串,创建字典,以char为key,value默认1,如果字典key中包含char则value+1。最后输出字典30.什么是装箱和拆箱?A:值类型到object是装箱,object到值类型是拆箱31.C#中委托是什么?事件是不是⼀种委托?A:委托是传递⼀个⽅法的引⽤,类似函数指针。事件是⼀种特殊的委托。de和重载的区别?A:override是重写⽅法的关键字,重载指⼀个⽅法的不同实现。33.什么叫应⽤程序域?A:就是程序之间的边界,可以理解⼀个程序是⼀个应⽤程序域。34.什么是不受管制的代码?A:unsafe关键字⾥写的⾮托管代码。不经过CLR运⾏。可以写指针等骚操作。 str = null和string str = “”的区别?A:null表⽰不存在于内存中没有地址,“”表⽰存在于内存中的“”这个对象36.描述class和struct异同?A:class是引⽤类型放在堆上的,struct是值类型放在栈上的。37. 能⽤foreach遍历访问的对象需要实现_____接⼝或声明_____⽅法的类型。A:IEnumerable接⼝、GetEnumerator()⽅法是什么?为什么需要GC?A:GC(Garbage Collector)是垃圾收集器。.net中垃圾收集器会⾃动对内存垃圾进⾏回收管理,因为有了CLR的GC机制。正常情况下,.net会⾃动的帮忙释放内存,如果⾮托管代码,则需要⼿动释放,⽐如dataread、WebRequest。39.接⼝可否继承接⼝?抽象类可否实现接⼝?抽象类可否继承实体类?A:接⼝可以继承接⼝。抽象类可以实现接⼝。抽象类可以继承实体类 (但是实体类必须有可访问的构造函数,所有类都⽆法继承只有private构造函数的实体类)。⾥有⼀个return语句,那么finally中的代码会不会执⾏,在return前还是return后?A:会,在return前执⾏。看反编译会发现finally的代码放在了函数出⼝之前。41.两个对象值相同(y)==true,但可能有不同的hash code,这个说法对吗?A:==⽐较地址,equals⽐较值*(等⽐地址Equals值)*。两个对象值相同则表⽰拥有相同的HashCode。42.进程和线程的区别?A:进程是系统进⾏资源分配和调度的单位;线程是CPU分配和调度的单位。⼀个进程可以有多个线程,这些线程共享这个进程的资源。(进程是系统层⾯,线程是CPU层⾯。线程∈进程)43.堆和栈的区别?A:栈上放的是由编译器⾃动分配释放的资源。堆上放的是代码中⾃⼰分配释放的资源,⽐如new对象时分配的内存空间。44.请指出GAC的含义?A:(Global Assembly Cache)全局程序集缓存。应该是指常⽤到的dll(⽐如,tions)会缓存在windows⼀个指定的⽂件夹下,别的程序再使⽤的话就直接调⽤,不⽤重新加载了。em…没折腾过。ader和DataSet有什么区别?A:DataReader是读取数据库的(游标类似)。DataSet是⽤来存放数据的。46.软件开发⼀般有⼏个阶段?每个阶段的作⽤?A:需求分析,详细设计(架构设计),代码编写,测试,部署```47.什么是强类型?什么是弱类型?哪种更好?为什么?A:需要在编译时定义变量类型的是强类型,⽐如User user= new User();不需要指定类型的为弱类型如js

var user={};好坏看业务需求,各有千秋。48.什么是反射?A:在程序运⾏时动态获取程序集信息:接⼝、类、⽅法、属性等。49.编程求从0-1000⼀共输出了多少个0?需要JS和C#?A:em.........抖个机灵,js参照这个。var str = "";```for (int i = 0; i < 1000; i++){ str += ng();}ine(('0').Length-1);50.表如下:⽤⼀条SQL语句显⽰如图的结果?表1:| id | department || :------| :------ || 1 | 设计 || 2 | 市场 || 3 | 售后 |表2:| id | dptID | name || :------| :------ | :------ || 1 | 1 | 张三 || 2 | 1 | 李四 || 3 | 2 | 王五 || 4 | 3 | 彭六 || 5 | 4 | 陈七 || 6 | 5 | 陈七 |结果:| id | dptID | department | name || :------| :------ | :------ | :------ || 1 | 1 | 设计 | 张三 || 2 | 1 | 设计 | 李四 || 3 | 2 | 市场 | 王五 || 4 | 3 | 售后 | 彭六 || 5 | 4 | ⿊⼈ | 陈七 |A:**isnull(列名,'指定值')可以使⽤coalesce(列名,'指定值')替换,结果⼀样**select min() as id,

min() as dptID,

isnull(ment,'⿊⼈') as department,

from users as u left join dpt as d on =p by name,department

order by 中lock关键字根据什么来产⽣边界(线程同步)?A:静态变量。(static object o=new Object();)52.在.NET中引⼊ref和out关键字的根本原因是什么?A:⽅法中操作的对象的地址和传⼊的参数地址不⼀致。ref修饰的变量在⽅法中改变值时候,实际参数也会改变。中的new关键字和override关键字的异同?A:要重写的⽅法都需要virtual关键字,但是override是重写了⽗类的⽅法,调⽤的话是⼦类重写后的⽅法;new是重新写了⼀个同名的⽅法,隐藏了⽗类的⽅法。如果把⼦类强制转换为⽗类的话new调⽤还是⽗类的⽅法,⽽override则调⽤⼦类重写的⽅法。:.NET MVC框架是通过什么来解析HTTP请求的。A:请求的method。。。。(⼀时半会没理解)5实质是?A:⼀种哈希(hash)散列算法。将字符串转换为字节数组后计算数组的hash值。55.分布式分类?A:1. 应⽤分布式:程序部署在多台机器上2. 缓存分布式:缓存部署在多台机器上3. 数据库分布式:数据库部署在多台机器上我当时就这么瞎⼏把回答的56.后台接⼝如何鉴权?⽐如开发了⼀个后台管理系统,如何防⽌别⼈拿到你请求的接⼝恶意攻击?A:OAuth使⽤accessToken访问。或者使⽤JWT57.纯webapi项⽬,前端请求的⽤户信息存储在哪⾥?A:web的话localStorage。不同端有不同的存储⽅式。⽣命周期?A:四种两类。(vue对象)创建前/后,挂载前/后(vue挂载到页⾯),更新前/后,销毁前/后。59.多线程的线程同步如何实现?A:1. 使⽤Monitor/lock关键字创建临界区2. 读写锁static private ReaderWriterLock _rwlock = new ReaderWriterLock();

//

请求读锁,如果10ms超时退出

_eReaderLock(10);

//...读取数据_eReaderLock(); //释放读锁//

请求写锁,如果100ms超时退出

_eWriterLock(100);

//...写⼊数据_eWriterLock(); //释放写锁3. 系统级别的:信号量(Semaphore),互斥(Mutex),事件(AutoResetEvent/ManualResetEvent) 。线程池1. 信号量(Semaphore)://当前允许同时访问线程数2;

最⼤允许数量=3

static Semaphore s = new Semaphore(2, 3);

static void Main(string[] args){ for (int i = 0; i < 10; i++) new Thread(Go).Start(); ne();}static void Go(){ while (true) { //WaitOne()和Release()必须成对出现,否则会⼀直等待/释放出错 e(); (1000); //因为当前数量为2,所以每sleep后输出2⾏

ine(dThreadId); e(); }}2. 互斥(Mutex):var _mtx = new Mutex();var _resource = new List();//

设置超时时限并在wait前退出⾮默认托管上下⽂

if (_e(1000, true)){ _("123"); _eMutex(); //WaitOne和ReleaseMutex必须成对出现, //否则会导致进程死锁的发⽣,会抛出AbandonedMutexException异常。}3. 事件(AutoResetEvent/ManualResetEvent)//处理线程等待的对象//false是⼿动set唤醒,如果传true则会在线程执⾏时⾃动setstatic EventWaitHandle wh = new AutoResetEvent(false);static void Main(){ new Thread(Waiter).Start();//1 new Thread(Waiter).Start();//2 new Thread(Waiter).Start();//3 (3000); //做任何耗时操作 //唤醒,继续执⾏刚才第⼀个线程输出,然后再⾃动挂起 ();

//再次唤醒会执⾏第⼆个线程输出,然后再⾃动挂起,AutoResetEvent是按顺序来的 //⽽ManuelResetEvent则在执⾏Set()后释放了所有挂起的线程 //();

y();}static void Waiter(){ ine(""); e(); //等待唤醒之后继续往下执⾏ //AutoResetEvent和ManuelResetEvent相⽐相当于⾃动执⾏了这⾏ //();

ine("Notified");}ManualResetEvent与AutoResetEvent区别是M的Set()⽅法⼀次释放所有挂起的线程,A在Set()之后⼜⾃动将后续线程挂起,需要再次Set()。A相当于M在WaitOne()之后执⾏()4. 线程池(em…暂时看不懂搜出来的东西⼤数据并发(例如秒杀活动,放到redis时并发怎么处理)?A:为redis加锁,别的进程判断如果锁存在则等待,直到锁被释放(通过时间戳等机制优化解决死锁)ached(与redis区别)、UML⽤过吗?A:⽤过Memochached,与redis的区别是redis有机制不是所有数据都放在内存中,会放磁盘⼀部分(重启不丢失)。redis⽀持更多数据类型(list,set,zset,hash),redis是单线程。Memcached单个value最⼤只⽀持1MB,Redis最⼤⽀持512MB。UML没⽤过。62.数据库锁了解过吗?A:共享(S)锁、排它(X)锁、更新(U)锁。避免脏读?A:我们只需要在实体中增加⼀个byte[]类型的字段,并为其加上[Timestamp]特性:public class Entity{ public string Name {get; set;} [Timestamp] public byte[] v {get; set;}

}这样在更新或删除操作⽣成的Sql中,Where语句将包含

and v = @2 条件,如果有其它⽤户更改过此⾏,那么⾏版本将不⼀致,因此更新或删除sql会⽆法找到要更新的⾏,此时EF将认定该操作出现了并发冲突。如果是控制某个列的并发,将ConcurrencyCheck特性添加到实体需要控制并发的⾮主键属性上即可。64.什么是事务?A:数据库的⼀种机制,在开启事务之后的操作中(如果发⽣了业务异常)可以将数据库回滚到开启事务之前的状态。65.说说你知道的数据库优化⽅式?A:1. 建⽴索引2. 使⽤存储过程3. 使⽤视图4. 优化查询语句66.数据库索引使⽤需要注意什么?什么是视图?如何做查询优化?A:1. ⼀个表内索引最好不要太多,⼀般在主键和经常做where条件或者group by或者order by的列上创建索引,如果表数据太⼩索引反⽽会影响性能。2. 视图是由⼀张或多张表联合查询出的虚拟表,复杂查询使⽤视图来代替联表查询会提升性能。3. 查询语句优化⼀般尽量避免全表扫描,以下⼏点会全表扫描:1. 使⽤null判断,会全表扫描。2.

<>(不等于)判断,会全表扫描。3. 使⽤or,会全表扫描。4. 左右模糊查询%xx%,会全表扫描。5. 尽量使⽤exists代替in,in会全表扫描。6. 尽量不要在where语句中判断运算后的结果,会全表扫描。67.什么是跨域?如何解决跨域问题?管道模型是什么?HttpHandler是什么?HttpModule是什么?中间件是什么?A:1. Http管道模型是指⼀个请求⼀层⼀层达到action,然后再⼀层⼀层出去的过程像个管道⼀样。2.

HttpHandle是ISAPI的aspnet_通过后缀名然后转发到不同的处理程序。⽐如.aspx会调⽤ndler处理页⾯。3.

HttpModule是请求在管道中经过的模块,可以⾃⾏编写实现⾝份认证、过滤器等功能。4. 中间件类似于HttpModule,也是在请求在管道中经过的模块,区别是HttpModule基于事件。(我是这么答的)69.堆栈区别?A:堆上存放引⽤类型数据,需要⼿动开辟内存空间(new的时候)。栈上存放值类型数据,不需要⼿动开辟内存空间。70. 数组是否值类型?A:数组都是引⽤类型,继承⾃,⽽Array继承⾃,众所周知值类型都是继承ype的。71.数组扩展长度内存操作原理 ?A:(这个⾯试官问的我到现在还没有理解他想问什么?可能是想问List在Add时候的扩容过程)如果有⼈问数组扩容或者List在Add时超出长度在内存中的过程就回答:如果新添加的元素超出数组长度则new⼀个更⼤的数组将原来数组copy过去。72.数组和集合区别 ?A:数组声明时是定长的,且声明类型⽐如int[5],内存上是连续存储的。集合则可以⼀直添加元素,声明时不⼀定声明类型(使⽤泛型)⽐如List。73.a="123"; b="123";内存怎么分布,b=a时呢?A:1.

“123”由于CLR的字符串驻留机制只存有⼀份。所以当a="123";b="123";时a和b都指向了"123"这个字符串的引⽤。2. 当b=a时是把a的引⽤copy了⼀份给b。74.分布式锁原理?A:通过某种⽅式加⼀把锁,让分布式程序执⾏⽅法时获取锁,保证 同⼀个⽅法同⼀时刻只能被⼀台机器上的⼀个线程访问。⼀般实现有:1. 通过数据库实现(加⼀条记录去读取之类的)。2. 通过redis实现。3. 通过Zookeeper(不知道是啥)。五种数据类型?A:1.

string2.

hash3.

list(值不唯⼀,可以通过pop实现简单消息队列)4.

set(值唯⼀)5.

MQ中交换机的理解?A:消息(Message)由Client发送,RabbitMQ接收到消息之后通过交换机转发到对应的队列上⾯。Worker会从队列中获取未被读取的数据处理。RabbitMQ包含四种不同的交换机类型:1.

Direct exchange:直连交换机,转发消息到routigKey指定的队列2.

Fanout exchange:扇形交换机,转发消息到所有绑定队列(速度最快)3.

Topic exchange:主题交换机,按规则转发消息(最灵活)4.

Headers exchange:⾸部交换机 (未接触)(抄的,只跑过收/发消息的demo)和readonly的区别?A:const是编译时定好⽆法改变的。readonly归根结底还是对象中的属性,是动态的,只不过修饰为只读⽽已。78.扩展⽅法是动态还是静态?怎么写扩展⽅法?A:扩展⽅法是静态的,只能存在于静态类中。写法跟函数差不多,第⼀个参数必写为this 要扩展的类型

xxx,然后xxx则是调⽤扩展⽅法的对象本⾝,⽐如扩展⼀个string类的⽅法:static void Output(this string str){ ine(str); //"123".Output();

执⾏后会输出123, //str对象就是调⽤⽅法的"123"字符串}相关理解?A:接⼝IA定义业务⽅法,A具体实现IA。通过IOC将实现类A注⼊到IA中,这样调⽤时虽然看起来是IA.⽅法(),其实执⾏的是实现类中的⽅法。实现了⾯向接⼝编程,降低对实现类的耦合。的理解和认识?什么是失⾎/贫⾎/充⾎/胀⾎模型?A:可以通过聚合、实体等概念梗清晰的描述业务,底层的CQRS(读写分离)、UOW(UnitOfWork,⾃动实现事务)、仓储层都很好⽤。1. 失⾎模型:领域模型只有get/set。没有任何实体业务逻辑,完全依赖service->DAL->domain调⽤。2. 贫⾎模型:领域模型除了get/set后包含⼀些简单的实体组装逻辑,还是依赖service->DAL->domain调⽤。3. 充⾎模型:领域模型包含DAL层的东西⽐如持久化,调⽤变为service->domain->DAL4. 胀⾎模型:取消service层,直接通过domain->DAL来调⽤执⾏业务(⾎越多领域层越复杂,对service层依赖越⼩)81. NET4.5 / 4.6以及历史版本的区别?A:.NET 3.0 引⼊WPF、WCF、WF。使⽤CLR 2.0,对应C# 3.0;.NET```3.5 引⼊Linq、EF、扩展⽅法、特性、Lambda。使⽤CLR 2.0,对应C# 3.0;.NET 4.0 增加了并⾏的⽀持。使⽤CLR 4.0,对应C# 4.0;.NET 4.5 增加了Task异步编程模型(async/await)。使⽤CLR 4.0,对应C# 5.0;.NET 4.6 优化(好像同时发布/引⼊了 Core)。使⽤CLR 4.0,对应C# 6.0;.NET 4.6.2 对应C#7.082. SqlServer使⽤SQL分页怎么实现?A:1. select top 页⼤⼩ from x where id not in(select top 页⼤⼩x(页码-1) id from x) 不推荐使⽤因为in会造成全表扫描。2.

select * from ( select *,ROW_NUMBER() OVER(order by id) as RowId from x) as twhere between 页⼤⼩x(页码-1) and 页⼤⼩x页码3.

--⽀持SQLSERVER 2012+的版本SELECT *

FROM x

ORDER BY id

OFFSET 页⼤⼩x(页码-1) ROWS --有点像Linq的Skip(x) FETCH NEXT 页⼤⼩ ROWS ONLY; --然后Take(x)ameter的原理?A:把所有参数当字符串⽽不是关键字来处理。84. IIS应⽤程序池经典模式和集成模式区别?A:经典模式:兼容IIS6.0,继续通过C盘下aspnet_来处理请求。集成模式:使⽤IIS和的集成请求处理管道来处理请求。85.如何全局处理异常?A:使⽤中间件记录处理异常,或者使⽤ExceptionFilter来捕获全局异常。86.说说Webapi的restful风格的了解?post和put的区别?A:对同⼀个接⼝地址通过不同的请求Method编写不同的逻辑。⼀般包括四种:1. get:查询2. post:添加3. put:更新4. delete:删除因为put⼀般代表更新操作,所以是幂等的,更新⼀万次对象还是存在。⽽post则不是幂等的,多次post会创建多个数据。87.:nuget包上传管理流程?A:1. nuget官⽹下载2. cmd```命令:nuget pack⽣成⽂件3. 登录nuget官⽹创建⼀个密钥4. cmd命令:nuget push 密钥 -Source /v3/5. 上传完成,可在VS中搜索到88.简述.NET CORE中IOC⽣命周期?A:1.

Transient(瞬间的):每次使⽤(获取这个服务的时候)时都会创建新的服务,适合轻量级的服务。2.

Scoped(作⽤域的):在同⼀次请求中只存在⼀次的服务。3.

Singleton(唯⼀的/单例的):全局只创建⼀次的服务,第⼀次被请求的时候被创建,然后就⼀直使⽤同⼀个。89.简述.net core中间件?A:中间件是在管道中处理请求的组件,处理完后可以传递给下⼀个组件。通过在Startup类的Configure⽅法中使⽤Use来使⽤中间件并可以调整顺序。.NET CORE中使⽤RequestDelegate来构建管道模型,所以⾃定义的中间件需要根据约定来实现,注意有三点:1. 中间件内要定义⼀个只读的RequestDelegate类型的变量作为调⽤下⼀个中间件的委托。2. 构造函数中要定义RequestDelegate类型的参数并赋给类⾥的变量,IOC会将请求注⼊进来。3. 定义⼀个Task类型的名为Invoke的函数,参数为HttpContext,在其中写中间件的逻辑,并在最后记得返回类中的RequestDelegate对象,传递HttpContext。.NET CORE会⾃动执⾏Invoke⽅法。public class RequestCultureMiddleware{ private readonly RequestDelegate _next; public RequestCultureMiddleware(RequestDelegate next) { _next = next; } public Task Invoke(HttpContext context) { //在这⾥可以对请求的上下⽂做操作如验证之类 //调⽤管道中的下⼀个中间件,向下传递 return this._next(context); }}⾏转列,实现效果如下的操作?数据表:| name | s```ubject | score || :------| :------ | :------ || 张三 | 语⽂ | 80 || 张三 | 数学 | 70 || 张三 | 英语 | 60 || 李四 | 语⽂ | 90 || 李四 | 数学 | 80 || 李四 | 英语 | 70 |转换为:| name | 语⽂ | 数学 | 英语 || :------| :------ | :------ | :------ || 张三 | 80 | 70 | 60 || 李四 | 90 | 80 | 70 |A:SqlServer中有PIVOT(旋转)关键字,PIVOT 后跟⼀个聚合函数来拿到结果,FOR 后⾯跟的科⽬是我们要转换的列(列转⾏使⽤UNPIVOT):SELECT *FROM tPIVOT ( SUM(score) FOR subject IN (语⽂, 数学, 英语))--SqlServer 2005+的版本附⼀个MySql版本:SELECT name SUM(IF(cource="语⽂", score, 0)) AS "语⽂", SUM(IF(cource="数学", score, 0)) AS "数学", SUM(IF(cource="英语", score, 0)) AS "英语"FROM tGROUP BY

group分组,having怎么⽤?A:跟在Group后⾯,像where⼀样使⽤,来筛选分组后的数据。⽐如:select sum(score) as s, name from x group by name having sum(score)>200--根据姓名分组后计算总分,并筛选总分⼤于200分的数据90.去除字符串中连续空格,多个空格变为⼀个?A:使⽤正则匹配之后替换:str = Regex("[s]+").Replace(str, " ");91.泛型的内部机制?A:以List为例,第⼀次编译时只是为T⽣成⼀个占位符。在实际⽤到时⽐如List时,JIT(Just-In-Time即时编译器)会⽤User去代替T的占位符实例化User,以此来实现泛型。

本文发布于:2023-06-21,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:sqlparameter

发布评论

评论列表(有0条评论)
    拓祥电子编程网

    拓祥电子编程网

    拓祥电子编程提供编程程序员技术分享技术,经验代码。