此框架是Dapper的扩展,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架

支持.net framework4.5.1,.net core2.0及以上,更低版本适配如.netFramework4.0及以下请加群下载

支持Mssql,Oracle,Mysql等数据库

应用层需要引用包Kogel.Dapper.Extension.MsSql(如果数据库是Oracle则引用Kogel.Dapper.Extension.Oracle),Nuget上可以下载安装。

或者使用Nuget命令添加包

Install-Package Kogel.Dapper.Extension.MsSql

 

(一)Model实体类

实体类层需要安装Kogel.Dapper.Extension表名字段特性。[更多特性详情请点击]

using Kogel.Dapper.Extension.Attributes;

 public class users
{
/// <summary>
/// 用户id(特性Identity标识该字段为主键)
/// </summary>
[Identity]
public int id { get; set; } /// <summary>
/// code
/// </summary>
public string code { get; set; } /// <summary>
/// 用户名称
/// </summary>
public string name { get; set; } /// <summary>
/// 创建方式(1自定义角色 2通用角色)
/// </summary>
public int createWay { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime createDate { get; set; } /// <summary>
/// 创建人
/// </summary>
public string createUsers { get; set; } /// <summary>
/// 角色id
/// </summary>
public int roleId { get; set; }
}

(二)使用实例

首先添加命名空间

using Kogel.Dapper.Extension.MsSql;

可以通过数据库连接对象点出扩展方法,例如

var conn = new SqlConnection("数据库连接字符串");

 

使用完记得释放连接对象,可以通过using或者 conn.Dispose();

查询

var users = conn.QuerySet<users>().Where(x => x.code != "1").Get();

模糊查询

var users1 = conn.QuerySet<users>().Where(x => x.name.Contains("Y")).Get();

查询一个数组条件

int[] array = new int[] { 1, 2, 3 };
//使用In
var comment = conn.QuerySet<Comment>().Where(x => x.Id.In(array)).ToList();
//或者使用Contains
var comment = conn.QuerySet<Comment>().Where(x => array.Contains(x.Id)).ToList();

使用sql查询

DynamicParameters param = new DynamicParameters();
param.Add("Id", 1);
var comment = conn.QuerySet<Comment>().Where("Id=@Id", param)
.ToList();

范围查找 

var comment = conn.QuerySet<Comment>().Where(x => x.Id.Between(1, 10)).ToList();

  

修改

var users=new users();
users.name = Guid.NewGuid().ToString();
users.createDate = DateTime.Now;
int result = conn.CommandSet<users>().Where(x => x.id == 4).Update(users);
 

自定义修改(修改指定字段)

int result = conn.CommandSet<Comment>()
.Where(x => x.Content == "test")
.Update(x => new Comment
{
Content = "test1"
});

新增

int result = conn.CommandSet<users>()
.Insert(new users() {
code = Guid.NewGuid().ToString(),
name = "test", createWay = 1,
createDate = DateTime.Now,
roleId = 2
}); 

新增返回自增Id

int result = conn.CommandSet<users>()
.InsertIdentity(new users() {
code = Guid.NewGuid().ToString(),
name = "test", createWay = 1,
createDate = DateTime.Now,
roleId = 2
});

  

删除

int result = conn.CommandSet<users>()
.Where(x => x.roleId == 2 && x.name == users2.name)
.Delete();

如果想使用事务

using (var conn = new SqlConnection(mysqlConnection))
{
//必须先打开数据库
conn.Open();
//创建事务对象
var transaction = conn.BeginTransaction();
//使用事务对象做修改
var result = conn.CommandSet<Comment>(transaction)
.Where(x => x.Id.Equals(1))
.Update(x => new Comment()
{
Content = "test"
});
//提交事务,回滚使用 transaction.Rollback();
transaction.Commit();
}

  

连表查询

Join<主表,副表>(主表关联字段,副表关联字段)

var list = conn.QuerySet<users>()
.Where(x => x.code != "1")
.Join<users, project_Role>(x => x.roleId, y => y.id)
.ToList();

  

任意条件连表

var list = conn.QuerySet<users>()
.Where(x => x.code != "1")
.Join<users, project_Role>((x,y)=>x.roleId==y.id)
.ToList();

  

还可以设置连表的方式(默认是Left Join)

var list = conn.QuerySet<users>()
.Where(x => x.code != "1")
.Join<users, project_Role>((x,y)=>x.roleId==y.id, JoinMode.LEFT)
.ToList();

  

连表查询可以渲染成指定实体类,例如动态类型(dynamic)

var list = conn.QuerySet<users>()
.Where(x => x.code != "1")
.Join<users, project_Role>(x => x.roleId, y => y.id)
.ToList<dynamic>();

翻页查询

//翻页查询第一页,10条数据
var list = conn.QuerySet<users>()
.OrderBy(x => x.createDate)
.PageList(1, 10); //翻页连表查询返回dynamic
var list1 = conn.QuerySet<users>()
.Join<users, project_Role>(x => x.roleId, y => y.id)
.OrderBy(x => x.createDate)
.PageList<dynamic>(1, 10);

多表任意联查

 var users = conn.QuerySet<users>()
.Join<users, project_Role>((a, b) => a.roleId == b.id)
.Where<users, project_Role>((a, b) => a.id == 3 && b.id == 3)
.Get<dynamic>();

 

3.14版本后Where函数和匿名返回类型支持比较复杂的函数判断

例如

var comment1 = conn.QuerySet<Comment>()
.Join<Comment, News>((a, b) => a.ArticleId == b.Id)
.Where(x => x.Id.Between(80, 100)
&& x.SubTime.AddDays(-10) < DateTime.Now && x.Id > 10
&& x.Id > new QuerySet<News>(conn, new MySqlProvider()).Where(y => y.Id < 3 && x.Id<y.Id).Sum<News>(y => y.Id)
)
.From<Comment, News>()
.OrderBy<News>(x => x.Id)
.PageList(1, 1, (a, b) => new
{
test = new List<int>() { 3, 3, 1 }.FirstOrDefault(y => y == 1),
aaa = "6666" + "777",
Content = a.Content + "'test'" + b.Headlines + a.IdentityId,
bbb = new QuerySet<Comment>(conn, new MySqlProvider())
.Where(y => y.ArticleId == b.Id && y.Content.Contains("test")).Sum<Comment>(x => x.Id),
ccc = a.IdentityId,
ddd = Convert.ToInt32("(select count(1) from Comment)"),
a.Id
});  

需要读取数据库的支持Sum和Count函数

不需要读取数据库的函数都支持,例如

 test = new List<int>() { 3, 3, 1 }.FirstOrDefault(y => y == 1)

  

批量新增

int result = conn.CommandSet<Comment>().Insert(commentList);  

以上操作都支持异步

3.1.8版本支持自定义导航查询

	var ContentList = conn.QuerySet<Comment>()
.ToList(x => new CommentDto()
{
Id = x.Id,
ArticleIds = x.ArticleId,
count = new QuerySet<News>(conn, new MySqlProvider()).Where(y => y.Id == x.ArticleId).Count(),
NewsList = new QuerySet<News>(conn, new MySqlProvider()).Where(y => y.Id == x.ArticleId).ToList(y => new NewsDto()
{
Id = y.Id,
Contents = y.Content
}).ToList()
});

(子属性返回暂时不支持匿名类)

(Dto类需要继承 IBaseEntity

(三)扩展的一些函数处理

Kogel.Dapper支持一些基础的sql函数

以及时间函数在不同数据库中的处理

还有字符的转换处理

(四)分组聚合

3.1.9.3版本后支持分组聚合查询

        var commne = conn.QuerySet<Comment>()
.Where(x => x.Id > && array1.Contains(x.Id) && x.Content.Replace("", "") == x.Content)
.Where(x => x.Id.In(array1))
.GroupBy(x => new { x.ArticleId })
.Having(x => Function.Sum(x.Id) >= )
.ToList(x => new
{
x.ArticleId,
test1 = Function.Sum(x.Id)
});

通过Function类点出函数,例如Function.Sum(字段)

更多扩展敬请期待

Kogel.Dapper还支持linq和sql同时使用

已完成更加复杂查询条件或者连表关系,[详情请点击此处]

框架开源,完整框架源码可以去Github上下载:

https://github.com/a935368322/Kogel.Dapper.Extension

如有问题也可以加QQ群讨论:

技术群 710217654


[LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询的更多相关文章

  1. [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  2. [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  3. [LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射

    此特性需要安装Kogel.Dapper.Mssql或者Oracle 3.06及以上版本,实体类层需要安装Kogel.Dapper.Extension 3.06及以上版本 目录 [LINQ2Dapper ...

  4. [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  5. [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL

    此例子是使用LINQ2Dapper封装,效率优于EntityFramwork,并且支持.NetFramework和.NetCore框架,只依赖于Dapper支持.net framework4.6.1及 ...

  6. [LINQ2Dapper]最完整Dapper To Linq框架(六)---多表联合与匿名类型返回

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  7. [LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  8. Linq的一些基础查询

    其中包括对数据中常用的条件查询,投影,分区,排序,分组,集合,元素,量词,和集集等标准查询操作符进行分类介绍 一.条件操作符 条件操作符where类似于SQL中的where子句,用于实现条件查询.下列 ...

  9. EntityFramework、Dapper vs 草根框架性能大比拼,数据库访问哪家强?

    扯淡 当前市面上 ORM 很多,有跑车型的,如 Dapper,有中规中矩型的,如 Mybatis.Net,也有重量型的,如 EntityFramework 和 NHibernate,还有一些出自草根之 ...

随机推荐

  1. 采用WPF开发截图程序,so easy!

    前言  QQ.微信截图功能已很强大了,似乎没必要在开发一个截图程序了.但是有时QQ热键就是被占用,不能快速的开启截屏:有时,天天挂着QQ,领导也不乐意.既然是程序员,就要自己开发截屏工具,功能随心所欲 ...

  2. 2019.4.22 python_Flag

    想了很久  最后觉得还是对编程的知识点好好重新的拉一边 回炉重造并不可笑 虽然从C到java到php到python 有两年的时间了 但是很多知识点都是零零碎碎,没有花时间复习和记录 所以决定从pyth ...

  3. 自力更生Collections.sort发现比较结果混乱?Comparator的锅还是强转类型导致?

    近日开发任务时间充裕一些,于是有时间回顾一下项目. 我关注到了项目中使用的七牛云的对象存储服务. 作为测试需要上传了一些图片,但七牛的控制台却无法将内容按照上传时间排序或者是按照日期查询,由于buck ...

  4. Linux及Windows安装Redis(详细)

    Linux及Windows安装Redis 1.Windows安装教程 1.1下载 https://github.com/MSOpenTech/redis/releases 进入github里下载red ...

  5. 让SpringBoot的jackson支持JavaBean嵌套的protobuf

    问题背景 REST 项目使用protobuf 来加速项目开发,定义了很多model,vo,最终返回的仍然是JSON. 项目中一般使用 一个Response类, public class Respons ...

  6. Javascript对this对象的理解

    在JavaScript中this表示函数运行的时候自动生成的一个内部对象,只能在函数内部使用,下面是一个简单的例子: function test(){ alert(this == window); } ...

  7. django-URL认识(一)

    URL由三部分组成:资源类型.存放资源的主机域名.资源文件名.也可认为由4部分组成:协议.主机.端口.路径 URL的一般语法格式为:(带方括号[]的为可选项): protocol :// hostna ...

  8. 面向对象之---this的用法

    在绝大多数情况下,函数的调用方式决定了this的值 全局环境 无论是否在严格模式下,在全局执行环境中,this都指向全局对象· 在全局作用域中调用一个函数时,this总是指向Global对象(在浏览器 ...

  9. Type of the default value for 'songs' prop must be a function

    eslint常会出现这样的错误提示,控制台打印:Type of the default value for 'songs' prop must be a function 解决办法有两种如下: 1:写 ...

  10. http和Https简介、详解

    目录 引用 一.HTTP和HTTPS的基本概念 二.HTTP与HTTPS有什么区别? 三.HTTPS的工作原理 四.HTTPS的优点 五.HTTPS的缺点 六.http切换到HTTPS 引用 超文本传 ...