为EasySharding.EFCore提供Dapper相关查询扩展
承接上一篇博文中的中间件基本都是写入性的操作,但对于查询操作实际上是比较鸡肋的,如果单纯的查询,没有分表的情况下基本还能适应,这里为了Dapper提供了扩展
Dapper的扩展查询是需要写表名称的,所以对于开发人员来说需要写表名称,同一个业务的查询就会出现问题,每个业务里面都需要去判断业务上的表名称,不利于开发维护,易出错的问题
所以扩展了 EasySharding.EFCore.DapperExtension 让开发人员不用过于关注表名称,只需要关注那些业务表有分表就行了
例如:


#region GetDbConnection
/// <summary>
/// 扩展给Dapper调用 支持分库分表
/// </summary>
/// <typeparam name="TContext"></typeparam>
/// <param name="shardingConnection"></param>
/// <returns></returns>
public static ShardingDbConnection GetShardingDbConnection<TContext>(this TContext context) where TContext : ShardingDbContext
{ return (ShardingDbConnection)Activator.CreateInstance(typeof(ShardingDbConnection), context.Database.GetDbConnection(), context.ShardingInfo); }
/// <summary>
/// 支持分库 默认支持
/// </summary>
/// <typeparam name="TContext"></typeparam>
/// <param name="shardingConnection"></param>
/// <returns></returns>
public static DbConnection GetDbConnection<TContext>(this TContext context) where TContext : ShardingDbContext
{
return context.Database.GetDbConnection();
}
#endregion #region Query
/// <summary>
/// 格式化分表查询处理 需要分表写 分表业务加上标记 注意sql语句中其他元素冲突{0}
/// 如:Select * from {TableName} as a join TB1 on a.id=b.id
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="shardingcon"></param>
/// <param name="sql"></param>
/// <returns></returns>
public static IEnumerable<T> QuerySharding<T>(this ShardingDbConnection shardingcon, string sql, object[] param = null) where T : class
{ return shardingcon._dbConnection.Query<T>(sql.SqlSharding(shardingcon._ShardingInfo.GetName()), param); } public static IEnumerable<dynamic> QuerySharding(this ShardingDbConnection shardingcon, string sql, object[] param = null)
{ return shardingcon._dbConnection.Query(sql.SqlSharding(shardingcon._ShardingInfo.GetName()), param); }
/// <summary>
/// 异步方法 格式化分表查询处理 需要分表写 分表业务加上标记 注意sql语句中其他元素冲突{0}
/// 如:Select * from {TableName} as a join TB1 on a.id=b.id
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="shardingcon"></param>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <returns></returns>
public static async Task<IEnumerable<T>> QueryShardingAsync<T>(this ShardingDbConnection shardingcon, string sql, object[] param = null) where T : class
{ return await shardingcon._dbConnection.QueryAsync<T>(sql.SqlSharding(shardingcon._ShardingInfo.GetName()), param); } public static async Task<IEnumerable<dynamic>> QueryShardingAsync(this ShardingDbConnection shardingcon, string sql, object[] param = null)
{ return await shardingcon._dbConnection.QueryAsync(sql.SqlSharding(shardingcon._ShardingInfo.GetName()), param); }
#endregion
扩展了对分库连接的Dapper支持方便


using var conquery = context.GetContext().GetDbConnection();
var testlst = conquery.Query<MySql.Test>("select * from Test"); using var conquery2 = context.GetShardingContext(new ShardingInfo
{
DatabaseTagName = $"easysharding",
StufixTableName = $"1",
ConStr = $"dbstr1",
});
var conquerysharding = conquery2.GetShardingDbConnection();
var testlst2 = conquerysharding.QuerySharding<MySql.Test>("select * from {Test}");
针对Sql中的表名称不需要关注具体表名称,知道业务表分表主题名称即可通过{TableName}加上花括号的方式 ,对应分库分表连接的上下文确定具体表操作。
GitHub:https://github.com/woshilangdanger/easysharding.efcore
为EasySharding.EFCore提供Dapper相关查询扩展的更多相关文章
- Dapper链接查询扩展
一对多映射关系 /// <summary> /// 一对多连接查询 /// </summary> /// <typeparam name="FirstT&quo ...
- Dapper 链式查询 扩展
Dapper 链式查询扩展 DapperSqlMaker Github地址:https://github.com/mumumutou/DapperSqlMaker 欢迎大佬加入 Demo: 查询 ...
- sql的行转列(PIVOT)与列转行(UNPIVOT) webapi 跨域问题 Dapper 链式查询 扩展 T4 代码生成 Demo (抽奖程序)
sql的行转列(PIVOT)与列转行(UNPIVOT) 在做数据统计的时候,行转列,列转行是经常碰到的问题.case when方式太麻烦了,而且可扩展性不强,可以使用 PIVOT,UNPIVOT比 ...
- EasySharding.EFCore 如何设计使用一套代码完成的EFCore Migration 构建Saas系统多租户不同业务需求且满足租户自定义分库分表、数据迁移能力?
下面用一篇文章来完成这些事情 多租户系统的设计单纯的来说业务,一套Saas多租户的系统,面临很多业务复杂性,不同的租户存在不同的业务需求,大部分相同的表结构,那么如何使用EFCore来完成这样的设计呢 ...
- 16.AutoMapper 之可查询扩展(Queryable Extensions)
https://www.jianshu.com/p/4b23e94a7825 可查询扩展(Queryable Extensions) 当在像NHibernate或者Entity Framework之类 ...
- Dapper的完整扩展(转)
真心想说:其实...我不想用Dapper,如果OrmLite.Net支持参数化的话,也就没Dapper的什么事情了,对于OrmLite.Net只能做后续跟踪...... 这个其实是看了Dapper作者 ...
- EFCore笔记之异步查询
当在数据库中执行查询时,异步查询可避免阻止线程. 这有助于避免冻结富客户端应用程序的 UI.异步操作还可以增加 Web 应用程序的吞吐量,可以在数据库操作完成时释放线程去处理其他请求. Entity ...
- 补充:sql server 中的相关查询、case函数
相关查询(在同一个表中) 相关查询类似子查询,但是又不同于子查询:子查询中的子条件可以单独查出数据,但是相关查询的子条件不能查处数据.(可以理解成C#中for的穷举法,第一个for走一个,第二个for ...
- 12306微信小程序上线 提供余票查询暂不支持购票
12306微信小程序正式上线,如图所示,目前小程序提供余票查询.时刻表查询和正晚点查询三大功能,用户可在这里随时查看剩余车票以及列车时刻表.而且小程序支持用户添加行程,方便出行. 目前这款小程序还不支 ...
随机推荐
- jquery:iframe里面的元素怎样触发父窗口元素的事件?
例如父窗口定义了一个事件. top: $(dom1).bind('topEvent', function(){}); 那么iframe里面的元素怎样触发父窗口dom1的事件呢?这样吗? $(dom1, ...
- 【死磕Java并发】—–深入分析volatile的实现原理
通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized.如果一个变量使用volatile,则它比使 ...
- CF420A Start Up 题解
Content 给定一个长度为 \(n\) 的字符串,求这个字符串整个反转过来后是否和原字符串一样. 数据范围:\(1\leqslant n\leqslant 10^5\). Solution 众所周 ...
- java 常用类库:操作系统System类,运行时环境Runtime
System类: System 类代表Java程序的运行平台,程序不能创建System类的对象, System类提供了一些类变量和类方法,允许直接通过 System 类来调用这些类变量和类方法. Sy ...
- TURN协议(RFC5766详解)
如果一台主机处于NAT后面,那么在一定条件下两台主机无法之间进行通讯.在这种条件下,那么使用中继服务提供通讯是有必要的. 这个规范定义了一个名为TURN(使用中继穿越NAT)的协议,它允许一台主机使用 ...
- AcWing1264. 动态求连续区间和 (树状数组做法)
1.题目 给定 n 个数组成的一个数列,规定有两种操作,一是修改某个元素,二是求子数列 [a,b] 的连续和. 输入格式 第一行包含两个整数 n 和 m,分别表示数的个数和操作次数. 第二行包含 n ...
- 【LeetCode】1167. Minimum Cost to Connect Sticks 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 小根堆 日期 题目地址:https://leetcod ...
- 【LeetCode】389. Find the Difference 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:字典统计次数 方法二:异或 方法三:排序 日 ...
- 【LeetCode】1071. Greatest Common Divisor of Strings 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力遍历 日期 题目地址:https://leetc ...
- MySQL定时备份数据库方案
MySQL数据备份 1.备份全部数据库的数据和结构 mysqldump -uroot -p123456 -A > /data/mysqlDump/mydb.sql 2.备份全部数据库的结构(加 ...