手机做任务网站有哪些内容,怀化最新消息今天,网站手机优化显示,wordpress注册审核本文demo适用于MySQL优点高性能、易排查、易运维、灵活可控缺点和EF相比#xff0c;手写sql当修改表结构不易发现bug。习惯了EF后再来使用Dapper#xff0c;会很难适应那种没有了强类型的安全感。不过可以用单元测和心细来避免。问题#xff1a;IDbConnection需不需要手动Op… 本文demo适用于MySQL优点高性能、易排查、易运维、灵活可控缺点和EF相比手写sql当修改表结构不易发现bug。习惯了EF后再来使用Dapper会很难适应那种没有了强类型的安全感。不过可以用单元测和心细来避免。问题IDbConnection需不需要手动Open打开连接答案有时候需要有时候不需要Dapper连接可分两种主动管理自己管理连接的打开和关闭和自动管理自动管理连接的打开和关闭bool wasClosed cnn.State ConnectionState.Closed;...if (wasClosed) cnn.Open();...if (wasClosed) cnn.Close();源码位置 https://github.com/StackExchange/Dapper/blob/master/Dapper/SqlMapper.cs#L530NoteADO.NET默认是启用连接池的 Pooling true,连接池中最大连接数,默认为100在使用Dapper的过程中你有可能遇到过连接池超过最大限制。那问题是怎么来的呢如果主动管理或者自动管理连接都不会有问题。就怕你管理一半打开不关闭DBContext dBContext2 new DBContext();dBContext2.DbConnection.Open();解决办法相信不用我说了。Note在使用事务的时候需要手动打开连接请不要忘记在catch里面Close。批量新增DbConnection.Execute(sqlStr, ListEntity);insert into tt (a,b,c,d) values (50,1,1,1), (51,2,1,2); var sql insert into tt (a,b,c,d) values (a1,b1,c1,d1), (a2,b2,c2,d2); DynamicParameters dynamicParameters new DynamicParameters();dynamicParameters.Add(a1,value);dynamicParameters.Add(b1,value);dynamicParameters.Add(c1,value);dynamicParameters.Add(a2,value);dynamicParameters.Add(b2,value);dynamicParameters.Add(c2,value);dynamicParameters.Add(d2,value);DbConnection.ExecuteScalarint(sql, dynamicParameters)批量修改//1、可通过匿名对象集合进行参数化数据修改。需要修改的值都不一样的情况下,性能优化参考4DbConnection.Execute(sqlStr, ListEntity);//2、如果需要修改的值都是一样只是条件不一样。(使用SQL语句中的IN语法)DbConnection.Execute(UPDATE tt SET aa aa where bb in bb;, new { aa, bb }); //3、快速批量修改此方法非常适合新增或修改数据的场景可通过建联合唯一索引来实现新增或修改的区分。【组合字段不能为空否则为空 不做唯一有重复空数据】insert into test_tbl (id,dr) values (1,2),(2,3),...(x,y) on duplicate key update drvalues(dr);//4、参数化防sql注入var sql insert into test_tbl (id,dr) values (id1,dr1),(id2,dr2),...(idn,drn) on duplicate key update drvalues(dr);DynamicParameters dynamicParameters new DynamicParameters();dynamicParameters.Add(id1,value);dynamicParameters.Add(dr1,value);dynamicParameters.Add(id2,value);dynamicParameters.Add(dr2,value);...dynamicParameters.Add(idn,value);dynamicParameters.Add(drn,value);DbConnection.ExecuteScalarint(sql, dynamicParameters)批量删除同理也可以使用参数化和IN语法查询第一条数据dBContext.DbConnection.QueryFirstOrDefaultItemFCLPO(SELECT * from itemfcl_temp limit 1;); dBContext.DbConnection.QueryFirstOrDefaultItemFCLPO(SELECT * from itemfcl_temp;); dBContext.DbConnection.QueryItemFCLPO(SELECT * from itemfcl_temp;).FirstOrDefault(); dBContext.DbConnection.QueryItemFCLPO(SELECT * from itemfcl_temp;).ToList().FirstOrDefault();If扩展方法使用过Mybatis的同学都知道在xml里面写if、else还是蛮好用的。虽然我还是不喜欢在xml里面写sql。那么在Dapper里面是不是也能简便操作答案是肯定的。这就得庆幸C#牛逼的语法了。public static class StringExtension{public static string If(this string str, bool condition){return condition ? str : string.Empty; }} 然后我们的sql就可以这样拼接了left join MaintenanceTemplates it on it.Id m.MaintenanceTemplateIdwhere m.IsDeleted 0{ and m.Code KeyWord .If(!string.IsNullOrWhiteSpace(input.KeyWord))}{ and m.ProjectId ProjectId .If(input.ProjectId.HasValue)}{ and a.ProductId ProductId .If(input.ProductId.HasValue)}比起以前又臭又长的if判断个人感觉好多了。NoteDapper不会因为传多了参数而报错所以放心使用If。使用EF的时候很方便做事务处理而在Dapper中貌似就没那么优雅了。我们每次在事务逻辑开始前都需要BeginTransaction开启事务结束后都需要CommitTransaction提交。代码看起来也就稍显混乱。如果我们通过特性标记的方式在标记了UnitOfWork特性的方法自动开启和提交事务那就完美了。如下[UnitOfWork]public virtual void Test(){}当然这是可行的。通过AOP拦截在方法执行前开启事务在方法执行后提交事务就可以了。实现如下需要Nuget包Autofac.Extensions.DependencyInjection Autofac.Extras.DynamicProxy[UnitOfWork]public virtual void DelUser(){var sql select * from UserTemp;var userList dBContext.DbConnection.Queryobject(sql);var sql2 $INSERT into UserTemp VALUES(0,{DateTime.Now.ToString()},sql2执行成功); dBContext.DbConnection.Execute(sql2);throw new Exception(主动报错);var sq3 $INSERT into UserTemp VALUES(0,{DateTime.Now.ToString()},sq3执行成功); dBContext.DbConnection.Execute(sq3);}public class UnitOfWorkIInterceptor : IInterceptor{private DBContext dBContext;public UnitOfWorkIInterceptor(DBContext dBContext){this.dBContext dBContext; }public void Intercept(IInvocation invocation){ MethodInfo methodInfo invocation.MethodInvocationTarget;if (methodInfo null) methodInfo invocation.Method; UnitOfWorkAttribute transaction methodInfo.GetCustomAttributesUnitOfWorkAttribute(true).FirstOrDefault();if (transaction ! null dBContext.Committed) { dBContext.BeginTransaction();try { invocation.Proceed(); dBContext.CommitTransaction(); }catch (Exception ex) { dBContext.RollBackTransaction();throw; } }else { invocation.Proceed(); } }}完整的测试源码会在文末提供。使用EF的同学应该很多人都知道MiniProfiler我在前些年分享EF的时候有做过简单介绍。那么我们在执行Dapper的时候是不是也可以对生成的sql做检测和性能监控。答案是肯定的。Git地址MiniProfiler监控套件还真不是一般的强。EF、MongoDB、MySql、Redis、SqlServer统统支持。接下来我们实现对Dapper监控导入Nuget包MiniProfiler.AspNetCorepublic class ActionFilter : IAsyncActionFilter{public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){var profiler MiniProfiler.StartNew(StartNew);using (profiler.Step(Level1)) {await next(); } WriteLog(profiler); } private void WriteLog(MiniProfiler profiler){if (profiler?.Root ! null) {var root profiler.Root;if (root.HasChildren) { root.Children.ForEach(chil {if (chil.CustomTimings?.Count 0) {foreach (var customTiming in chil.CustomTimings) {var all_sql new Liststring();var err_sql new Liststring();var all_log new Liststring();int i 1; customTiming.Value?.ForEach(value {if (value.ExecuteType ! OpenAsync) all_sql.Add(value.CommandString);if (value.Errored) err_sql.Add(value.CommandString);var log $【{customTiming.Key}{i}】{value.CommandString} Execute time :{value.DurationMilliseconds} ms,Start offset :{value.StartMilliseconds} ms,Errored :{value.Errored}; all_log.Add(log); }); } } }); } } }}运行效果完整的Demo源码https://github.com/zhaopeiym/BlogDemoCode/tree/master/Dapper_Demo/DapperDemo最后给大家推荐一个开源项目quartzuihttps://github.com/zhaopeiym/quartzui基于Quartz.NET 3.0的web管理界面开箱即用。也可以完美运行在树莓派上。docker run -v /fileData/quartzuifile:/app/File --restartunless-stopped --privilegedtrue --name quartzui -dp 5088:80 bennyzhao/quartzui:RaspberryPi 运行在普通PC或云主机上docker run -v /fileData/quartzuifile:/app/File --restartunless-stopped --privilegedtrue --name quartzui -dp 5088:80 bennyzhao/quartzui 新建QQ群工控物联995475200原文地址https://www.cnblogs.com/zhaopei/p/dapper.html.NET社区新闻深度好文欢迎访问公众号文章汇总 http://www.csharpkit.com