Split table

This commit is contained in:
sunkaixuna
2021-10-30 16:29:09 +08:00
parent a5e64c062b
commit 22dc0ff39e
7 changed files with 50 additions and 16 deletions

View File

@@ -28,25 +28,38 @@ namespace OrmTest
//初始化分表 //初始化分表
db.CodeFirst.SplitTables().InitTables<OrderSpliteTest>(); db.CodeFirst.SplitTables().InitTables<OrderSpliteTest>();
Console.WriteLine();
//根据最近3个表进行查询 //根据最近3个表进行查询
var list=db.Queryable<OrderSpliteTest>().Where(it=>it.Pk==Guid.NewGuid()) var list=db.Queryable<OrderSpliteTest>().Where(it=>it.Pk==Guid.NewGuid())
.SplitTable(tabs => tabs.Take(3)) .SplitTable(tabs => tabs.Take(3))
.Where(it=>it.Time==DateTime.Now).ToOffsetPage(1,2); .Where(it=>it.Time==DateTime.Now).ToOffsetPage(1,2);
Console.WriteLine();
//根据时间选出的表进行查询 //根据时间选出的表进行查询
var list2 = db.Queryable<OrderSpliteTest>().SplitTable(tabs => tabs.Where(it=> it.Date>=DateTime.Now.AddYears(-2))).ToList(); var list2 = db.Queryable<OrderSpliteTest>().SplitTable(tabs => tabs.Where(it=> it.Date>=DateTime.Now.AddYears(-2))).ToList();
Console.WriteLine();
//删除数据只在最近3张表执行操作 //删除数据只在最近3张表执行操作
var x = db.Deleteable<OrderSpliteTest>().Where(it=>it.Pk==Guid.NewGuid()).SplitTable(tabs => tabs.Take(3)).ExecuteCommand(); var x = db.Deleteable<OrderSpliteTest>().Where(it=>it.Pk==Guid.NewGuid()).SplitTable(tabs => tabs.Take(3)).ExecuteCommand();
Console.WriteLine();
var tableName = db.SplitHelper<OrderSpliteTest>().GetTableName(DateTime.Now.AddDays(-1));
var x2 = db.Updateable<OrderSpliteTest>() var x2 = db.Updateable<OrderSpliteTest>()
.SetColumns(it=>it.Name=="a") .SetColumns(it=>it.Name=="a")
.Where(it => it.Pk == Guid.NewGuid()) .Where(it => it.Pk == Guid.NewGuid())
.SplitTable(tabs => tabs.Take(3)) .SplitTable(tabs => tabs.InTableNames(tableName))
.ExecuteCommand(); .ExecuteCommand();
Console.WriteLine();
//按日分表 //按日分表
var x3 = db.Insertable(new OrderSpliteTest() { Name="A" }).SplitTable().ExecuteCommand(); var x3 = db.Insertable(new OrderSpliteTest() { Name="A" }).SplitTable().ExecuteCommand();
Console.WriteLine();
////强制分表类型 ////强制分表类型
var x4 = db.Insertable(new OrderSpliteTest() { Name = "A" ,Time=DateTime.Now.AddDays(-1) }).SplitTable().ExecuteCommand(); var x4 = db.Insertable(new OrderSpliteTest() { Name = "A" ,Time=DateTime.Now.AddDays(-1) }).SplitTable().ExecuteCommand();
Console.WriteLine("#### CodeFirst end ####"); Console.WriteLine("#### CodeFirst end ####");

View File

@@ -43,6 +43,7 @@ namespace SqlSugar
#endregion #endregion
#region Other methods #region Other methods
SplitTableContext SplitHelper<T>();
DateTime GetDate(); DateTime GetDate();
//SimpleClient GetSimpleClient(); //SimpleClient GetSimpleClient();
SimpleClient<T> GetSimpleClient<T>() where T : class, new(); SimpleClient<T> GetSimpleClient<T>() where T : class, new();

View File

@@ -1,19 +1,20 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace SqlSugar namespace SqlSugar
{ {
internal class SplitTableContext public class SplitTableContext
{ {
public SqlSugarProvider Context { get; set; } internal SqlSugarProvider Context { get; set; }
public EntityInfo EntityInfo { get; set; } internal EntityInfo EntityInfo { get; set; }
public ISplitTableService Service { get; set; } internal ISplitTableService Service { get; set; }
private SplitTableContext() { } private SplitTableContext() { }
public SplitTableContext(SqlSugarProvider context) internal SplitTableContext(SqlSugarProvider context)
{ {
this.Context = context; this.Context = context;
if (this.Context.CurrentConnectionConfig.ConfigureExternalServices != null&&this.Context.CurrentConnectionConfig.ConfigureExternalServices.SplitTableService!=null) if (this.Context.CurrentConnectionConfig.ConfigureExternalServices != null&&this.Context.CurrentConnectionConfig.ConfigureExternalServices.SplitTableService!=null)
@@ -35,23 +36,29 @@ namespace SqlSugar
return result; return result;
} }
internal string GetDefaultTableName() public string GetDefaultTableName()
{ {
return Service.GetTableName(this.Context,EntityInfo); return Service.GetTableName(this.Context,EntityInfo);
} }
internal string GetTableName(SplitType splitType) public string GetTableName(SplitType splitType)
{ {
return Service.GetTableName(this.Context,EntityInfo, splitType); return Service.GetTableName(this.Context,EntityInfo, splitType);
} }
internal string GetTableName(SplitType splitType, object fieldValue) public string GetTableName(SplitType splitType, object fieldValue)
{ {
return Service.GetTableName(this.Context,EntityInfo, splitType, fieldValue); return Service.GetTableName(this.Context,EntityInfo, splitType, fieldValue);
} }
internal object GetValue(SplitType splitType, object entityValue) public string GetTableName(object fieldValue)
{
var attribute = EntityInfo.Type.GetCustomAttribute<SplitTableAttribute>() as SplitTableAttribute;
Check.Exception(attribute == null, $" {EntityInfo.EntityName} need SplitTableAttribute");
return Service.GetTableName(this.Context, EntityInfo, attribute.SplitType, fieldValue);
}
public object GetValue(SplitType splitType, object entityValue)
{ {
return Service.GetFieldValue(this.Context,EntityInfo, splitType, entityValue); return Service.GetFieldValue(this.Context,EntityInfo, splitType, entityValue);
} }
public void CheckPrimaryKey() internal void CheckPrimaryKey()
{ {
Check.Exception(EntityInfo.Columns.Any(it => it.IsIdentity == true), ErrorMessage.GetThrowMessage("Split table can't IsIdentity=true", "分表禁止使用自增列")); Check.Exception(EntityInfo.Columns.Any(it => it.IsIdentity == true), ErrorMessage.GetThrowMessage("Split table can't IsIdentity=true", "分表禁止使用自增列"));
} }

View File

@@ -6,10 +6,11 @@ using System.Threading.Tasks;
namespace SqlSugar namespace SqlSugar
{ {
public static class SplitTypeExtensions public static class SplitTableInfoExtensions
{ {
public static IEnumerable<SplitTableInfo> InTableNames(this List<SplitTableInfo> tables, params string[] tableNames)
{
return tables.Where(it => tableNames.Any(y => y.Equals(it.TableName, StringComparison.OrdinalIgnoreCase)));
}
} }
} }

View File

@@ -846,6 +846,14 @@ namespace SqlSugar
#endregion #endregion
#region Helper #region Helper
public SplitTableContext SplitHelper<T>()
{
var result = new SplitTableContext(this.Context)
{
EntityInfo = this.Context.EntityMaintenance.GetEntityInfo<T>()
};
return result;
}
private SqlSugarProvider GetContext() private SqlSugarProvider GetContext()
{ {
SqlSugarProvider result = null; SqlSugarProvider result = null;

View File

@@ -596,6 +596,10 @@ namespace SqlSugar
{ {
return ScopedContext.Updateable(UpdateObjs); return ScopedContext.Updateable(UpdateObjs);
} }
public SplitTableContext SplitHelper<T>()
{
return ScopedContext.SplitHelper<T>();
}
public SqlSguarTransaction UseTran() public SqlSguarTransaction UseTran()
{ {
return ScopedContext.UseTran(); return ScopedContext.UseTran();