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

话说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));         }     } }

Appium元素定位和UiAutomator表达式目录一常见属性的用法1。怎么用resourceid?2。其它属性二通过截图就可以看到元素的属性,那怎么元素定位呢?1。appiumapp页面元素定位2。UiAutomator的表达元宇宙版百度Create大会来了据悉将于12月线上举办来源中国网日前,有消息称,百度CreateAI开发者大会将于今年12月与开发者和网民见面。今年的Create大会将在元宇宙里举办,把开发者装进这个虚拟的空间。百度CreateAI开12岁男孩掌握NFT财富密码,净赚29万英镑近日,英国一名12岁男孩通过区块链技术中的NFT领域,创作出了怪异鲸鱼的像素加密图,并将其以110个以太币的价格出售,赚了约29万英镑。12岁男孩掌握NFT的财富密码净赚29万英镑告别续航焦虑!德国电动汽车CityOne亮相配四节电池谈及电动汽车时,我们不能忽略的是快速充电基础设施的问题。快充装置不仅限制了电动汽车的大规模发展,还增加了使用成本。德国汽车制造商AdaptiveCityMobility(ACM)初华为月底发布两款新机!搭载鸿蒙2。1高通芯片不管怎么样,终于发出来了。9月6日上午,华为终端官方微博宣布全新华为nova9系列确认在9月23日上市,但官方除了公布上市日期和暗示核心亮点之外,并没有透露其他信息。但是好在该系列为什么iPhone11不香了,4G的华为P50却依然热销?看看京东手机销量。苹果第一,华为连小米都比不过有这会事whatwhatwhatiPhone11什么时候上市的,华为p50什么时候上市的,你咋不拿iPhone1来对比不知道你怎么理解不用担心收假币!移动支付行业迎重大变革,不需要联网也能给钱互联网发展迅速,让人们的生活也更加便利,尤其是移动支付普及后,人们出门买东西更加方便了,手机一扫就可以付款,省去了带现金的麻烦,顾客不怕丢钱了,商家也不用担心收到假币。因此,现在已三星s20fe,一部让人心动的产品三星S20fe这款手机近期在电商平台的补贴下价位算是比较合适,针对于大多数的普通用户想要入手一款中端产品其实不妨可以考虑一下三星的手机。那么为什么我会推荐三星S20fe这款手机,其无钴电池首面市,蜂巢能源成全球唯一产业化企业蜂巢能源在近日的成都车展中宣布,已经开发出全球首款无钴电池包,并将正式搭载欧拉樱桃猫进行量产装车。这一技术已经远超特斯拉LG化学等公司,成为全球第一。但钴在电池中有着重大的作用,为小米打印机已上市多年,为何技术实力更强的华为打印机却姗姗来迟小米打印机出现很多年了,使用小米打印机的用户数量还算是比较多的,但是到了半年度的9月份,华为也要开始推出打印机啦!可谓是姗姗来迟,华为打印机目前比较引人注意的功能就是WIFI功能,除了格力,国产空调哪家好!用料厚道!能用很多年吗?我来说说我的一些看法,仅供参考。关于空调,在我国已经是是一个比较成熟的家电产品,不论从技术方面,还是材料,制造等各方面。所以说我们的国产品牌里只要是一些正规的,稍具有一定规模的品牌
iQOO新机发布在即,Neo5系列价格触底,网友可以入手了早在三月末时,iQOO官方就放出了新机iQOONeo6即将发布的消息,并称该机为全面进化的次世代游戏旗舰,这样的定位成功引起iQOO粉丝们的关注。随后也有不少关于iQOONeo6的2022年4月8日币圈大事件今日早报迪拜一咖啡馆现在接受SHIB和其他加密货币付款金色财经消息,迪拜一家名为BakeNMore的咖啡馆现在接受SHIB和其他加密货币付款。BakeNMore的支付网络将由MixinNe交控科技2021年净利2。91亿同比增长22。89董事长郜春海薪酬163。14万挖贝网4月7日,交控科技(688015)近日发布2021年度报告,报告期内公司实现营业收入2,582,126,709。86元,同比增长27。44归属于上市公司股东的净利润291,0麒麟9905G芯片再现,拍照旗舰华为P40Pro重新上架官方商城由于众所周知的原因,华为这两年的手机业务受到了很大的影响,很多热门机型因为没有芯片可用,处于长期缺货的状态,而很多在售卖的机型,采用的都是4G芯片,对于消费者的吸引力还是降低了很多微信支付宝接入数字人民币果粉之家,专业苹果手机技术研究十年!您身边的苹果专家近日,数字人民币App迎来再度更新,微众银行(微信支付)和网商银行(支付宝)的数字人民币钱包现已正式上线。同时微信官方宣布全面支三星电子一季度营业利润飚增50强大需求扭转芯片价格下跌影响财联社(上海,编辑马兰)讯,当地时间4月7日,韩国三星电子有限公司公布其一季度初步业绩报告。数据显示,其一季度盈利增长50,创下2018年以来最高同期利润水平。金融数据公司路孚特(需要一个项目管理系统,咨询过很多都不太满意,定制系统成本又太高,怎么办?我们的就是基于开源系统定制的,各个公司项目管理方式,逻辑,流程各不相同,直接用根本行不通,系统里除了基础架构和整体页面风格延用,其他基本上算是重新开发了,包括项目模板项目工单项目类西数16TB硬盘直降500元京东此款目前活动售价1999元,点击链接领取满1100减500元优惠券,实付低至1499元。WesternDigital西部数据16TB企业级硬盘采用氦气密封,与空气填充硬盘相比,联发科赢麻了!三星旗舰手机被曝要用联发科,都怪自家芯片不给力联发科今年的势头相当猛,连三星都在近期被曝光,将在自家主打次旗舰的手机S22FE上,用上联发科芯片。在过去,只有三星的中低端手机会用联发科,如果真如传闻所说,三星S22FE用上了联任正非签发总裁令,5G收费标准确立,高通苹果等都跑不掉本文原创,请勿抄袭和搬运,违者必究一些业务的变局给华为营收增长带来了挑战,2021年华为实现营收6369亿元,比2020年的8914亿元下降了2545亿元。这失去的两千多亿营收足够特斯拉将召回超12。7万辆进口及国产Model3来源盖世汽车Nicole4月7日,据国家市场监督管理总局官网消息,特斯拉汽车(北京)有限公司特斯拉(上海)有限公司向国家市场监督管理总局备案了召回计划,决定自2022年4月7日起,