范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

话说C程序员人手一个ORM

  话说C#程序员人手一个ORM,确实没有必要再写ORM了,不过我的ORM并不是新的,是从DBHelper演化过来的,算是DBHelper魔改版。
  目前流行的ORM有EF、Dapper、SqlSugar、FreeSql、Chloe等,有经验的程序员总是在这些ORM基础上或者在DBHelper基础上再封装一套,再加上自己写ORM的,可谓人手一套ORM。可能是因为在框架当中,编写ORM,入门相对简单吧,但是做好很难。
  主要是自己用的,如果别人要用的话,建议从gitee或github上拉源码下来,源码在手好控制,源码相对简单,有经验的程序员不难看懂,可以自己调试修改扩展,Lambda表达式是新支持的,如果Lambda hold不住,就使用原生SQL。
  跟主流ORM相比还是比较欠缺的,它只是一个DBHelper。  源码地址(VS2015、.NET Framework 4.5.2):
  https://gitee.com/s0611163/DBHelper
  https://github.com/0611163/DBHelper  .NET Core 5 版本源码地址(VS2019、.NET 5):
  https://gitee.com/s0611163/DBHelperCore  性能测试
  DBHelper SqlSugar EntityFramework 增删改查 性能对比测试
  https://www.cnblogs.com/s0611163/p/15814051.html
  为什么每个主流ORM都说性能比EF好,都说EF性能不好?而我的测试结果显示EF性能挺好的,为了防止有缓存,每项测试前,重启程序再测,性能还是一样的。批量添加和修改,别的ORM是快很多,但它使用了别的专门的方法。
  该ORM介绍及使用示例如下:  DBHelper简介
  一款轻量级ORM,查询使用原生SQL,查询结果映射到实体类,增删改支持实体类,支持Oracle、MSSQL、MySQL、SQLite等多种数据库,有配套Model生成器,方便自己扩展以支持更多数据库  特点支持Oracle、MSSQL、MySQL、SQLite四种数据库  方便扩展以支持更多关系数据库  有配套的Model生成器  insert、update、delete操作无需写SQL  查询使用原生SQL  查询结果通过映射转成实体类或实体类集合  支持参数化查询,通过SqlString类提供非常方便的参数化查询  支持连接多个数据源  单表查询、单表分页查询、简单的联表分页查询支持Lambda表达式  支持原生SQL和Lambda表达式混写  优点代码实现比较简单,有经验的程序员容易掌控代码,自己修改和扩展  查询使用原生SQL  缺点联表查询对Lambda表达式的支持比较弱  复杂查询不支持Lambda表达式  建议单表查询可以使用Lambda表达式  联表查询以及复杂查询建议使用原生SQL或原生SQL和Lambda表达式混写  示例定义数据库对象public class DBHelper {     #region 变量     private static ISessionHelper _sessionHelper = new SessionHelper(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString(), DBType.MySQL);     #endregion      #region 获取 ISession     ///      /// 获取 ISession     ///      public static ISession GetSession()     {         return _sessionHelper.GetSession();     }     #endregion      #region 获取 ISession (异步)     ///      /// 获取 ISession (异步)     ///      public static async Task GetSessionAsync()     {         return await _sessionHelper.GetSessionAsync();     }     #endregion  } 使用Model生成器生成实体类实体类放在Models文件夹中  扩展实体类放在ExtModels文件夹中  实体类和扩展实体类使用partial修饰,实际上是一个类,放在不同的文件中  如果需要添加自定义属性,请修改ExtModels,不要修改Models  实体类示例///  /// 订单表 ///  [Serializable] [DBTable("bs_order")] public partial class BsOrder {      ///      /// 主键     ///      [DBKey]     [DBField]     public string Id { get; set; }      ///      /// 订单时间     ///      [DBField("order_time")]     public DateTime OrderTime { get; set; }      ///      /// 订单金额     ///      [DBField]     public decimal? Amount { get; set; }      ///      /// 下单用户     ///      [DBField("order_userid")]     public long OrderUserid { get; set; }      ///      /// 订单状态(0草稿 1已下单 2已付款 3已发货 4完成)     ///      [DBField]     public int Status { get; set; }      ///      /// 备注     ///      [DBField]     public string Remark { get; set; }      ///      /// 创建者ID     ///      [DBField("create_userid")]     public string CreateUserid { get; set; }      ///      /// 创建时间     ///      [DBField("create_time")]     public DateTime CreateTime { get; set; }      ///      /// 更新者ID     ///      [DBField("update_userid")]     public string UpdateUserid { get; set; }      ///      /// 更新时间     ///      [DBField("update_time")]     public DateTime? UpdateTime { get; set; }  } 修改扩展实体类修改扩展实体类,添加自定义属性  下面的扩展实体类中,查询时OrderUserRealName会被自动填充,查询SQL:select t.*, u.real_name as OrderUserRealName from ......  DetailList不会被自动填充,需要手动查询  扩展实体类示例///  /// 订单表 ///  public partial class BsOrder {     ///      /// 订单明细集合     ///      public List DetailList { get; set; }      ///      /// 下单用户姓名     ///      public string OrderUserRealName { get; set; }      ///      /// 下单用户名     ///      public string OrderUserName { get; set; } } 添加public void Insert(SysUser info) {     using (var session = DBHelper.GetSession())     {         session.Insert(info);     } } 批量添加public void Insert(List list) {     using (var session = DBHelper.GetSession())     {         session.Insert(list);     } } 修改public void Update(SysUser info) {     using (var session = DBHelper.GetSession())     {         session.Update(info);     } } 批量修改public void Update(List list) {     using (var session = DBHelper.GetSession())     {         session.Update(list);     } } 删除public void Delete(string id) {     using (var session = DBHelper.GetSession())     {         session.DeleteById(id);     } } 条件删除using (var session = DBHelper.GetSession()) {     session.DeleteByCondition(string.Format("id>=12")); } 查询单个记录public SysUser Get(string id) {     using (var session = DBHelper.GetSession())     {         return session.FindById(id);     } } using (var session = DBHelper.GetSession()) {     return session.FindBySql("select * from sys_user"); } 简单查询using (var session = DBHelper.GetSession()) {     string sql = "select * from CARINFO_MERGE";     List result = session.FindListBySql(sql); } 条件查询public List GetList(int? status, string remark, DateTime? startTime, DateTime? endTime) {     using (var session = DBHelper.GetSession())     {         SqlString sql = session.CreateSqlString(@"             select t.*, u.real_name as OrderUserRealName             from bs_order t             left join sys_user u on t.order_userid=u.id             where 1=1");          sql.AppendIf(status.HasValue, " and t.status=@status", status);          sql.AppendIf(!string.IsNullOrWhiteSpace(remark), " and t.remark like concat("%",@remark,"%")", remark);          sql.AppendIf(startTime.HasValue, " and t.order_time>=STR_TO_DATE(@startTime, "%Y-%m-%d %H:%i:%s") ", startTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));          sql.AppendIf(endTime.HasValue, " and t.order_time<=STR_TO_DATE(@endTime, "%Y-%m-%d %H:%i:%s") ", endTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));          sql.Append(" order by t.order_time desc, t.id asc ");          List list = session.FindListBySql(sql.SQL, sql.Params);         return list;     } } 分页查询public List GetListPage(ref PageModel pageModel, int? status, string remark, DateTime? startTime, DateTime? endTime) {     using (var session = DBHelper.GetSession())     {         SqlString sql = session.CreateSqlString(@"             select t.*, u.real_name as OrderUserRealName             from bs_order t             left join sys_user u on t.order_userid=u.id             where 1=1");          sql.AppendIf(status.HasValue, " and t.status=@status", status);          sql.AppendIf(!string.IsNullOrWhiteSpace(remark), " and t.remark like concat("%",@remark,"%")", remark);          sql.AppendIf(startTime.HasValue, " and t.order_time>=STR_TO_DATE(@startTime, "%Y-%m-%d %H:%i:%s") ", startTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));          sql.AppendIf(endTime.HasValue, " and t.order_time<=STR_TO_DATE(@endTime, "%Y-%m-%d %H:%i:%s") ", endTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));          string orderby = " order by t.order_time desc, t.id asc ";         pageModel = session.FindPageBySql(sql.SQL, orderby, pageModel.PageSize, pageModel.CurrentPage, sql.Params);         return pageModel.GetResult();     } } 事务public string Insert(BsOrder order, List detailList) {     using (var session = DBHelper.GetSession())     {         try         {             session.BeginTransaction();              order.Id = Guid.NewGuid().ToString("N");             order.CreateTime = DateTime.Now;              decimal amount = 0;             foreach (BsOrderDetail detail in detailList)             {                 detail.Id = Guid.NewGuid().ToString("N");                 detail.OrderId = order.Id;                 detail.CreateTime = DateTime.Now;                 amount += detail.Price * detail.Quantity;                 session.Insert(detail);             }             order.Amount = amount;              session.Insert(order);              session.CommitTransaction();              return order.Id;         }         catch (Exception ex)         {             session.RollbackTransaction();             Console.WriteLine(ex.Message + "r " + ex.StackTrace);             throw ex;         }     } } 异步查询public async Task> GetListPageAsync(PageModel pageModel, int? status, string remark, DateTime? startTime, DateTime? endTime) {     using (var session = await DBHelper.GetSessionAsync())     {         SqlString sql = session.CreateSqlString(@"             select t.*, u.real_name as OrderUserRealName             from bs_order t             left join sys_user u on t.order_userid=u.id             where 1=1");          sql.AppendIf(status.HasValue, " and t.status=@status", status);          sql.AppendIf(!string.IsNullOrWhiteSpace(remark), " and t.remark like concat("%",@remark,"%")", remark);          sql.AppendIf(startTime.HasValue, " and t.order_time>=STR_TO_DATE(@startTime, "%Y-%m-%d %H:%i:%s") ", startTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));          sql.AppendIf(endTime.HasValue, " and t.order_time<=STR_TO_DATE(@endTime, "%Y-%m-%d %H:%i:%s") ", endTime.Value.ToString("yyyy-MM-dd HH:mm:ss"));          string orderby = " order by t.order_time desc, t.id asc ";         pageModel = await session.FindPageBySqlAsync(sql.SQL, orderby, pageModel.PageSize, pageModel.CurrentPage, sql.Params);         return pageModel.GetResult();     } } 条件查询(使用 ForContains、ForStartsWith、ForEndsWith、ForDateTime、ForList 等辅助方法)public List GetListExt(int? status, string remark, DateTime? startTime, DateTime? endTime, string ids) {     using (var session = DBHelper.GetSession())     {         SqlString sql = session.CreateSqlString(@"             select t.*, u.real_name as OrderUserRealName             from bs_order t             left join sys_user u on t.order_userid=u.id             where 1=1");          sql.AppendIf(status.HasValue, " and t.status=@status", status);          sql.AppendIf(!string.IsNullOrWhiteSpace(remark), " and t.remark like @remark", sql.ForContains(remark));          sql.AppendIf(startTime.HasValue, " and t.order_time >= @startTime ", sql.ForDateTime(startTime.Value));          sql.AppendIf(endTime.HasValue, " and t.order_time <= @endTime ", sql.ForDateTime(endTime.Value));          sql.Append(" and t.id in @ids ", sql.ForList(ids.Split(",").ToList()));          sql.Append(" order by t.order_time desc, t.id asc ");          List list = session.FindListBySql(sql.SQL, sql.Params);         return list;     } } 使用Lambda表达式单表查询
  单表分页查询使用ToPageList替换ToList即可  public void TestQueryByLambda6() {     using (var session = DBHelper.GetSession())     {         SqlString sql = session.CreateSqlString();          string remark = "测试";          List list = sql.Query()              .WhereIf(!string.IsNullOrWhiteSpace(remark),                 t => t.Remark.Contains(remark)                 && t.CreateTime < DateTime.Now                 && t.CreateUserid == "10")              .OrderByDescending(t => t.OrderTime).OrderBy(t => t.Id)             .ToList();          foreach (BsOrder item in list)         {             Console.WriteLine(ModelToStringUtil.ToString(item));         }     } } 使用Lambda表达式联表分页查询(简单的联表查询,复杂情况请使用原生SQL或原生SQL和Lambda表达式混写)public void TestQueryByLambda7() {     using (var session = DBHelper.GetSession())     {         SqlString sql = session.CreateSqlString();          int total;         List idsNotIn = new List() { "100007", "100008", "100009" };          List list = sql.Query()             .Select(u => u.UserName, t => t.OrderUserName)             .Select(u => u.RealName, t => t.OrderUserRealName)             .LeftJoin((t, u) => t.OrderUserid == u.Id)             .LeftJoin((t, d) => t.Id == d.OrderId)             .Where((t, u, d) => t.Remark.Contains("订单") && u.CreateUserid == "1" && d.GoodsName != null)             .WhereIf(true, t => t.Remark.Contains("测试"))             .WhereIf(true, t => !idsNotIn.Contains(t.Id))             .WhereIf(true, u => u.CreateUserid == "1")             .OrderByDescending(t => t.OrderTime).OrderBy(t => t.Id)             .ToPageList(1, 20, out total);          foreach (BsOrder item in list)         {             Console.WriteLine(ModelToStringUtil.ToString(item));         }     } } 原生SQL和Lambda表达式混写public void TestQueryByLambda9() {     using (var session = DBHelper.GetSession())     {         SqlString sql = session.CreateSqlString(@"             select t.*, u.real_name as OrderUserRealName             from bs_order t             left join sys_user u on t.order_userid=u.id             where 1=1");          List list = sql.Where(t => t.Status == int.Parse("0")             && t.Status == new BsOrder().Status             && t.Remark.Contains("订单")             && t.Remark != null             && t.OrderTime >= new DateTime(2010, 1, 1)             && t.OrderTime <= DateTime.Now.AddDays(1))             .WhereIf(true, u => u.CreateTime < DateTime.Now)             .OrderByDescending(t => t.OrderTime).OrderBy(t => t.Id)             .ToList();          foreach (BsOrder item in list)         {             Console.WriteLine(ModelToStringUtil.ToString(item));         }     } }

手机远程控制红外老电器,向日葵智能远控遥控器亲测相信很多家庭还在用旧式的带遥控电器,特别是电视和空调,但科技发达的今天,许多家用电器已经实现了手机遥控,就算找不到遥控器,用手机也可以轻松控制家里的智能电器,那么旧式电器也想用手机脑机接口软件有了中国平台中国青年报客户端讯(中青报中青网记者胡春艳通讯员焦德芳)日前,天津大学医学工程与转化医学研究院天津脑科学与类脑研究中心教育部智能医学工程研究中心与燧世智能等单位合作,联合推出我国首三部门开展钢铁行业智能制造行动计划,在铁矿开采等领域突破一批关键共性技术据工信部网站消息,工业和信息化部国家发展和改革委员会生态环境部联合发布关于促进钢铁工业高质量发展的指导意见,其中提出,大力发展智能制造。开展钢铁行业智能制造行动计划,推进5G工业互铁路搭载智能技术,科技助力北京冬奥2月4日晚,第二十四届冬季奥林匹克运动会开幕式在北京国家体育场隆重拉开帷幕并顺利举行。北京冬奥会的开幕式科技感拉满全场,温馨感动之余也让世人为中国的高科技水平所折服。在全力提倡低碳字节跳动是如何解决这些技术难题的?字节技术年货祝全天下的开发者朋友,新年职业发展虎啸风生,新年工资增速如虎添翼,新年爱情运势虎跃龙骧,新年代码事故下虎口逃生,虎!虎!虎!社区里缺少的不是架构图,而是可供参考复用的架构实践。技术超过2。61亿人下载应用程序数字人民币加快推广步伐据香港南华早报网站近日报道,中国已经在全国试点推出数字人民币,有超过2。61亿人下载了数字人民币钱包应用程序,中方希望它最终能够帮助推进人民币国际化。美联储在其有史以来第一份关于潜支付宝开始补偿这种老用户,快看你有无资格哈喽,欢迎来到黑马公社相互宝,在发布公告确认关停后,于1月28日正式关停,自此,这个用户量曾经高达1亿的网络互助平台彻底退出大众视野。关于相互宝的是是非非,黑马此前已经聊过,感兴趣以企业总部看全球五大通信设备供应商,三星中兴以超高层引领前言通信设备英文简称ICD,咱们家里或办公室最常见的无线路由器,modem,交换机等等就是属于这类设备。超高层一般是指高度超过100米的建筑。正文近年来,互联网技术高速发展,这些都早报新能源车传来利好冰雪旅游受追捧春节消费虎虎生威三亮点凸显春节消费虎虎生威春节假期前五天,网联平台共处理跨机构网络支付交易62。36亿笔,金额4。2万亿元,同比增长5。30和11。58。点评春节消费市场虎虎生威。冰雪经济风生水起中经评论科技范儿装扮冰雪盛会创新成果全民共享核心观点中国经济网评论员子房先生认为,举世关注的北京冬奥盛会,让科技成果走进赛场,也将会迈向千家万户。一起向未来,这句口号传遍大江南北世界各地,彰显着携手向前的共同愿望,凝聚着全人网联平台春节假期前5天处理交易4。2万亿元今年春节假期,您花了多少钱?有多少钱用在网络交易中?根据网联清算平台发布的最新数据显示,春节假期前五天(1月31日至2月4日),网联平台共处理交易金额4。20万亿元,同比增长超过1
华为开始销售二手手机,如果二手手机也卖完了,该怎么办呢?财智道据我判断,华为经营二手机,绝不会局限于自有品牌的二手机,还会收购小米ov,三星,甚至苹果的机器,对系统重刷鸿蒙,软件优化,电池换新,并做好严格的检测后,重新销售。这套打法下来为什么监控摄像头像素最高才200万?这是一个需要经常回答的问题。为什么监控摄像头最高才200万?首先,监控摄像头像素最高不是200万。400万500万600万800万1200万的监控摄像机已经上市好几年了。只不过目前惠普SpectreX360是如何成为内容创作者不可或缺的一部分?在日常工作中,我经常会出去和客户就视频项目进行交流。轻薄笔记本是我的最爱。另外,在其他地方进行一些项目时,不可避免的要携带大量的摄影器材。随身携带一本轻薄的笔记本自然是理想之选。惠腾讯投资皮皮鲁总动员持股27,少儿内容再加码腾讯投资了皮皮鲁总动员上游动漫猫猫家众乐童乐等少儿内容公司。8月25日,三文娱获悉,腾讯完成了对北京皮皮鲁总动员文化科技有限公司(以下简称皮皮鲁总动员)的投资,持股比例26。980耳背式助听器跟耳内式助听器分别适合什么样的人?耳背式助听器跟耳内式助听器分别适合什么样的人?你好,耳背式一般适合年龄大的,听力比较重的,手脚不太灵活人,还有中耳炎患者也比较适合佩戴耳背式助听器,一般年轻人对外形比较在意的会选配闪迪大师外置硬盘(5TB)金属防护外壳,专为户外摄影师打造作为一位影像创作者,我无时无刻都在寻找灵感,往往为了想法我总会回归大自然,试图在自然的世界中获取答案。相比室内,户外的环境经常面临各种意外,崎岖陡峭的山路,变化多端的天气,这一刻还为什么老百姓要求取缔占人行道的停车场?应该是取缔收费的非机动车道停车场!因为这已经成了某些人的发财之路!城市道路规划的不合理,人行道是给行人走的,但你看看现在,停满了机动车,本来宽敞的道路变得狭窄拥挤,停车收费可以增加两个男孩在他们的车库里进行以太坊挖矿,月收入32,000美元一些人出售想象中的朋友,而另一些人则在他们的车库中进行了加密货币挖矿业务。毫无疑问,卖糖果或柠檬水的时代已经过去了,今天的孩子们带来了鲨鱼的头脑。两个美国兄弟通过他们在自家车库建立氢燃料PK锂电池,一场永远无法终止的战争卡车之家原创伴随着新能源技术的普及,且在碳中和的大背景下,无论国内还是国外的主机厂都已在不断加码研发费用,以便抢占未来主流车型的制高点。我们已经不难发现,尽管新能源商用车在短时间内滴滴扩大智能汽车部门中国智能汽车行业市场全景调研滴滴扩大智能汽车部门滴滴官方网站的招聘页面显示,该公司自上月底开放了智能汽车部门逾100个职位,其中包括设计工程采购和物流。消息人士指出,这标志着智能汽车部门将在目前600名雇员的5000元以上,顶级旗舰,如何选?看需求在连续介绍了各价位相对突出的产品之后,现在价格来到了5000元以上,整体来说5000元以上的选择相对5000元以下的选择要更聚焦一些,今天我们就为大家带来5000元以上的顶级旗舰如