前言

这是针对dapper的一个扩展,支持lambda表达式的写法,链式风格让开发者使用起来更加优雅、直观。现在暂时只有MsSql的扩展,也没有实现事务的写法,将会在后续的版本补充。

这是个人业余的开源小项目,如果大家有更好的实现方式和好的建议欢迎拍砖

本项目已经在github上开源了:Sikiro.DapperLambdaExtension.MsSql

去年写了《整理自己的.net工具库》,里面提供的源码重新发布到了github并用新的项目名Sikiro.Tookits

这两个项目都发布到Nuget上了,可以在Nuget搜索Sikiro可以全部查看到

另外该项目会用到一些表达式树的知识,如果有兴趣的朋友可以先去了解,我之前也写过一篇简单的文章《表达式树的解析.》

下面是简单的使用介绍

开始

Nuget

你可以运行以下下命令在你的项目中安装 Sikiro.DapperLambdaExtension.MsSql。

  1. PM> Install-Package Sikiro.DapperLambdaExtension.MsSql

SqlConnection

  1. var con = new SqlConnection("Data Source=192.168.13.46;Initial Catalog=SkyChen;Persist Security Info=True;User ID=sa;Password=123456789");

定义User

  1. [Table("SYS_USER")]
  2. public class SysUser
  3. {
  4. /// <summary>
  5. /// 主键
  6. /// </summary>
  7. [Key]
  8. [Required]
  9. [StringLength(32)]
  10. [Display(Name = "主键")]
  11. [Column("SYS_USERID")]
  12. public string SysUserid { get; set; }
  13. /// <summary>
  14. /// 创建时间
  15. /// </summary>
  16. [Required]
  17. [Display(Name = "创建时间")]
  18. [Column("CREATE_DATETIME")]
  19. public DateTime CreateDatetime { get; set; }
  20. /// <summary>
  21. /// 邮箱
  22. /// </summary>
  23. [Required]
  24. [StringLength(32)]
  25. [Display(Name = "邮箱")]
  26. [Column("EMAIL")]
  27. public string Email { get; set; }
  28. /// <summary>
  29. /// USER_STATUS
  30. /// </summary>
  31. [Required]
  32. [Display(Name = "USER_STATUS")]
  33. [Column("USER_STATUS")]
  34. public int UserStatus { get; set; }
  35. }

Insert

  1. con.CommandSet<SysUser>().Insert(new SysUser
  2. {
  3. CreateDatetime = DateTime.Now,
  4. Email = "287245177@qq.com",
  5. SysUserid = Guid.NewGuid().ToString("N"),
  6. UserName = "chengong",
  7. });

当不存在某条件记录Insert

  1. con.CommandSet<SysUser>().IfNotExists(a => a.Email == "287245177@qq.com").Insert(new SysUser
  2. {
  3. CreateDatetime = DateTime.Now,
  4. Email = "287245177@qq.com",
  5. SysUserid = Guid.NewGuid().ToString("N"),
  6. UserName = "chengong",
  7. });

UPDATE

您可以根据某个条件把指定字段更新

  1. con.CommandSet<SysUser>().Where(a => a.Email == "287245177@qq.com").Update(a => new SysUser { Email = "123456789@qq.com" });

也可以根据主键来更新整个实体字段信息

  1. User.Email = "123456789@qq.com";
  2. condb.CommandSet<SysUser>().Update(User);

DELETE

您可以根据条件来删除数据

  1. con.CommandSet<SysUser>().Where(a => a.Email == "287245177@qq.com").Delete()

QUERY

GET

获取过滤条件的一条数据(第一条)

  1. con.QuerySet<SysUser>().Where(a => a.Email == "287245177@qq.com").Get()

TOLIST

当然我们也可以查询出符合条件的数据集

  1. con.QuerySet<SysUser>().Where(a => a.Email == "287245177@qq.com").OrderBy(b => b.Email).Top(10).Select(a => a.Email).ToList();

PAGELIST

还有分页

  1. con.QuerySet<SysUser>().Where(a => a.Email == "287245177@qq.com")
  2. .OrderBy(a => a.CreateDatetime)
  3. .Select(a => new SysUser { Email = a.Email, CreateDatetime = a.CreateDatetime, SysUserid = a.SysUserid })
  4. .PageList(1, 10);

UPDATESELECT

先更新再把结果查询出来

  1. con.QuerySet<SysUser>().Where(a => a.Email == "287245177@qq.com")
  2. .OrderBy(a => a.CreateDatetime)
  3. .Select(a => new SysUser { Email = a.Email })
  4. .UpdateSelect(a => new SysUser { Email = "2530665632@qq.com" });

事务功能

  1. con.Transaction(tc =>
  2. {
  3. var sysUserid = tc.QuerySet<SysUser>().Where(a => a.Email == "287245177@qq.com").Select(a => a.SysUserid).Get();
  4. tc.CommandSet<SysUser>().Where(a => a.SysUserid == sysUserid).Delete();
  5. tc.CommandSet<SysUser>().Insert(new SysUser
  6. {
  7. CreateDatetime = DateTime.Now,
  8. Email = "287245177@qq.com",
  9. Mobile = "13536059332",
  10. RealName = "大笨贞",
  11. SysUserid = Guid.NewGuid().ToString("N"),
  12. UserName = "fengshuzhen",
  13. UserStatus = 1,
  14. UserType = 1,
  15. Password = "asdasdad"
  16. });
  17. });

最后来一个完整的DEMO

  1. using (var con = new SqlConnection("Data Source=192.168.13.46;Initial Catalog=SkyChen;Persist Security Info=True;User ID=sa;Password=123456789"))
  2. {
  3. con.CommandSet<SysUser>().Insert(new SysUser
  4. {
  5. CreateDatetime = DateTime.Now,
  6. Email = "287245177@qq.com",
  7. SysUserid = Guid.NewGuid().ToString("N"),
  8. UserName = "chengong",
  9. });
  10. var model = con.QuerySet<SysUser>().Where(a => a.Email == "287245177@qq.com").Get();
  11. con.CommandSet<SysUser>().Where(a => a.SysUserid == model.SysUserid)
  12. .Update(a => new SysUser { Email = "2548987@qq.com" });
  13. con.CommandSet<SysUser>().Where(a => a.SysUserid == model.SysUserid).Delete();
  14. }

其他

除了简单的CURD还有Count、Sum、Exists

结束

第一个版本有未完善的地方,如果大家有很好的建议欢迎随时向我提,希望得到大家的建议后能良好的改善升级

编写自己的dapper lambda扩展-使用篇的更多相关文章

  1. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  2. 封装自己的dapper lambda扩展-设计篇

    前言 昨天开源了业务业余时间自己封装的dapper lambda扩展,同时写了篇博文<编写自己的dapper lambda扩展-使用篇>简单的介绍了下其使用,今天将分享下它的设计思路 链式 ...

  3. 开源Dapper的Lambda扩展-Sikiro.Dapper.Extension V2.0

    前言 去年我在业余时间,自己整了一套dapper的lambda表达式的封装,原本是作为了一个个人的娱乐项目,当时也只支持了Sql Server数据库.随之开源后,有不少朋友也对此做了试用,也对我这个项 ...

  4. 基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础介绍

    LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼. 文档地址: https://lining ...

  5. 基于Dapper的开源Lambda扩展LnskyDB 2.0已支持多表查询

    LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼. 文档地址: https://lining ...

  6. 基于Dapper的开源Lambda扩展LnskyDB 3.0已支持Mysql数据库

    LnskyDB LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.,现在已经支持MySql和Sql serv ...

  7. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  8. [转]深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  9. 深入理解Java 8 Lambda(类库篇——Streams API,Collectors和并行)

    转载:http://zh.lucida.me/blog/java-8-lambdas-inside-out-library-features/ 关于 深入理解 Java 8 Lambda(语言篇——l ...

随机推荐

  1. Java 数据驱动测试

    适用场景 测试搜索功能, 基于数据类型需要测多种不同的数据, 比如最大值, 小数, 负数, 字符串, 特异符号等等. 如果直接写代码, 每一种数据类型都需要写一遍代码, 冗长且不方便调试. 如果采用数 ...

  2. HTML语言和CSS开发

    第一张 HTML基础1.HTML:超文本标记语言(它除了文字,还能写图片.视频.音频.交互),他不是编程语言,它是标记语言2. <!DOCTYPE html> HTML5版本申明 < ...

  3. 搭建iSCSI文件服务器故障转移群集

    故障转移群集(Failover Cluster)可以提供一个高可用性应用程序或服务的网络环境,本章将接受如何搭建iSCSI SAN文件服务器故障转移群集. 故障转移群集概述 我们可以将多台服务器组成一 ...

  4. DMZ 区域

    下面对DMZ区域进行简要介绍:DMZ是网络的一个区域,介于外网与内网之间的一个特殊区域,也称隔离区.它不同于传统的防火墙设置,DMZ防火墙方案为要保护的内部网络增加了一道安全防线,通常认为是非常安全的 ...

  5. [Mac] How do I move a window whose title bar is off-screen?

    有时窗口一不小心拖出视野外了,此时无法移动窗口.如何还原? 有人遇到相似问题,已有解决方法: 方法就是,菜单 Windows - Zoom  这时窗口会还原.

  6. PJ可能会考的模拟与枚举-自学教程

    PJ可能会考的模拟与枚举-自学教程 文/Pleiades_Antares 之前学校里看一个小可爱复习的时候偷偷听来着XD 简单记了一下重点吧,希望能对看官您有所帮助XD 以下⬇️是几个复习时讲过的题, ...

  7. Sketch网页截屏插件设计开发

    1.需求 在Sketch的Artboard中插入网页截图: 1.1.输入网址,自动截图到Artboard中,并居中显示: 1.2.可截取网页局部图片 2.技术选型 技术的选型主要是针对截图功能的选型, ...

  8. ansible-task模块写法归类

    转载: https://blog.csdn.net/pushiqiang/article/details/78249665

  9. Qt 编程指南 4 按钮

    1按钮类的控件 逐个解释一下各个用途:(1)按压按钮 QPushButton最基本的按钮,点击该按钮通常是通知程序进行一个操作,比如弹个窗.下一步.保存.退出等等,这是经常用到的,操作系统里的对话框里 ...

  10. 转载 使用axis2构建webservice

    axis2是可以实现webservice的一个插件,使用这个插件可以发布webservice 1:可以使用这个插件来发布webservice,可以看网址:http://clq9761.iteye.co ...