第三十五节:ShardingCore框架高级(自定义路由规则、分页、动态追加分库分表、批量操作、事务等等)

一. 自定义路由规则

(这里以自定义分表路由规则为例)

1 要求

 (1) 根据用户年龄Age字段来分表,分三张表,分别是SysUser_A、SysUser_B、SysUser_C

 (2) 1-10岁在A表  11-20岁在B表   21岁及以上在C表

 

2 核心步骤

  (1) 自定义分表需要继承 AbstractShardingOperatorVirtualTableRoute 类

  (2) 重写GetTails方法,返回表的后缀; 重写Configure方法,定义分表字段和分隔符

  (3) 重写ShardingKeyToTail方法,自定义规则,让shardingKey返回对应表的后缀名

  (4) 重写GetRouteToFilter方法,过滤后缀,如下所示

分享虚拟路由代码

public class SysUserZdyVirtualTableRoute : AbstractShardingOperatorVirtualTableRoute<SysUser, string>
{
    /// <summary>
    /// 返回所有表的后缀
    /// </summary>
    /// <returns></returns>
    public override List<string> GetTails()
    {
        return ["A", "B", "C"];
    }
    /// <summary>
    /// 分表的相关配置
    /// </summary>
    /// <param name="builder"></param>
    public override void Configure(EntityMetadataTableBuilder<SysUser> builder)
    {
        //表示根据Age进行分表
        builder.ShardingProperty(o => o.Age);
        //表中间的分隔符,默认就是这个
        builder.TableSeparator("_");
    }
    /// <summary>
    /// 定义如何将shardingkey的value转换成对应的表后缀
    /// </summary>
    /// <param name="shardingKey">分表键</param>
    /// <returns></returns>
    /// <exception cref="InvalidOperationException"></exception>
    public override string ShardingKeyToTail(object shardingKey)
    {
        // ShardingCoreHelper.GetStringHashCode(mykey) 获取string的hash值
        int mykey = Convert.ToInt32(shardingKey);
        if (mykey >= 1 && mykey <= 10)
        {
            return "A";
        }
        else if (mykey >= 11 && mykey <= 20)
        {
            return "B";
        }
        else
        {
            return "C";
        }
    }
    /// <summary>
    /// 如何过滤后缀
    /// 下面是通用写法,不用改
    /// </summary>
    /// <param name="shardingKey"></param>
    /// <param name="shardingOperator"></param>
    /// <returns></returns>
    public override Func<string, bool> GetRouteToFilter(string shardingKey, ShardingOperatorEnum shardingOperator)
    {
        //因为hash路由仅支持等于所以仅仅只需要写等于的情况
        var t = ShardingKeyToTail(shardingKey);
        switch (shardingOperator)
        {
            case ShardingOperatorEnum.Equal: { return tail => tail == t; }
            default: { return tail => true; }
        }
    }
}

 

3. 其他

  其他的配置与之前相同,这里不再赘述

 

 

二. 高性能分页

 

  详见文档:https://xuejmnet.github.io/sharding-core-doc/adv/pagination/

  未实操

 

 

三. 动态追加表库

 

 

  详见:https://xuejmnet.github.io/sharding-core-doc/adv/dynamic-table/

  PS:文档版本太老,存在问题

 

 

 

四. 批量操作

 

  经测试

  EFCore自带的批量修改、批量删除 是可以正常使用的。

  但是,三方框架【EFCore.BulkExtensions】 和 【Zack.EFCore.Batch.MSSQL_NET8】 都报错,可能需要再配置啥??

  都报错,找不到对应的表,比如:SysUser

 

 

 

五. 事务

 

 

  详见:https://xuejmnet.github.io/sharding-core-doc/adv/transaction/

 

 

 

 

 

 

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @   Yaopengfei  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
历史上的今天:
2017-12-08 第十二节:MVC中的一些特殊优化
点击右上角即可分享
微信分享提示