修改部分demo
This commit is contained in:
parent
30c73fc949
commit
faeba5159d
|
@ -35,6 +35,7 @@
|
|||
- 版本号第二位是efcore版本号使用对应的版本号即可
|
||||
- 最后两位版本号使用最大即可
|
||||
|
||||
- efcore8使用shardingcore7.8.x.x,
|
||||
- efcore7使用shardingcore7.7.x.x,
|
||||
- efcore6使用shardingcore7.6.x.x,
|
||||
- efcore5使用shardingcore7.5.x.x,
|
||||
|
|
|
@ -34,6 +34,8 @@ high performance lightweight solution for efcore sharding table and sharding dat
|
|||
- first version is shardingcore version
|
||||
- second version is efcore version
|
||||
- other version use last version
|
||||
-
|
||||
- efcore8 use shardingcore7.8.x.x
|
||||
|
||||
- efcore7 use shardingcore7.7.x.x
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ namespace ShardingCore6x
|
|||
public string Payer { get; set; }
|
||||
|
||||
public OrderStatusEnum OrderStatus { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public enum OrderStatusEnum
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
using System.Diagnostics;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Internal;
|
||||
using Microsoft.EntityFrameworkCore.Storage;
|
||||
using MySqlConnector;
|
||||
using Sample.MySql.DbContexts;
|
||||
using Sample.MySql.Domain.Entities;
|
||||
using Sample.MySql.multi;
|
||||
using Sample.MySql.Shardings;
|
||||
using ShardingCore;
|
||||
using ShardingCore.Core.RuntimeContexts;
|
||||
using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources;
|
||||
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
||||
|
@ -63,14 +66,16 @@ namespace Sample.MySql.Controllers
|
|||
[Route("[controller]/[action]")]
|
||||
public class WeatherForecastController : ControllerBase
|
||||
{
|
||||
private readonly IShardingRuntimeContext<DefaultShardingDbContext> _defaultShardingRuntimeContext;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly UnShardingDbContext _unShardingDbContext;
|
||||
private readonly DefaultShardingDbContext _defaultTableDbContext;
|
||||
private readonly IShardingRuntimeContext _shardingRuntimeContext;
|
||||
private readonly ABC _abc;
|
||||
|
||||
public WeatherForecastController(IServiceProvider serviceProvider,UnShardingDbContext unShardingDbContext,DefaultShardingDbContext defaultTableDbContext,IShardingRuntimeContext shardingRuntimeContext)
|
||||
public WeatherForecastController(IShardingRuntimeContext<DefaultShardingDbContext> defaultShardingRuntimeContext,IServiceProvider serviceProvider,UnShardingDbContext unShardingDbContext,DefaultShardingDbContext defaultTableDbContext,IShardingRuntimeContext shardingRuntimeContext)
|
||||
{
|
||||
_defaultShardingRuntimeContext = defaultShardingRuntimeContext;
|
||||
_serviceProvider = serviceProvider;
|
||||
_unShardingDbContext = unShardingDbContext;
|
||||
_defaultTableDbContext = defaultTableDbContext;
|
||||
|
@ -80,6 +85,25 @@ namespace Sample.MySql.Controllers
|
|||
|
||||
public IQueryable<SysTest> GetAll()
|
||||
{
|
||||
var dbContextOptionsBuilder = new DbContextOptionsBuilder<DefaultShardingDbContext>();
|
||||
var dbContextOptionBuilderCreator = _shardingRuntimeContext.GetDbContextOptionBuilderCreator();
|
||||
dbContextOptionsBuilder.UseDefaultSharding<DefaultShardingDbContext>(_shardingRuntimeContext);
|
||||
using (var dbContext = new DefaultShardingDbContext(dbContextOptionsBuilder.Options))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
foreach (var dataSourceDbContext in _defaultTableDbContext.GetShardingExecutor().GetCurrentDbContexts())
|
||||
{
|
||||
foreach (var keyValuePair in dataSourceDbContext.Value.GetCurrentContexts())
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
((IResettableService)_defaultTableDbContext).ResetState();
|
||||
|
||||
var dataSourceRouteManager = _shardingRuntimeContext.GetDataSourceRouteManager();
|
||||
// dataSourceRouteManager.GetRoute()
|
||||
var routeManager = _shardingRuntimeContext.GetTableRouteManager();
|
||||
|
@ -96,8 +120,8 @@ namespace Sample.MySql.Controllers
|
|||
var tableRouteManager = routeManager;
|
||||
//系统的时间分片都会实现 ITailAppendable 如果不是系统的自定义的转成你自己的对象即可
|
||||
var tableRoute = tableRouteManager.GetRoute(typeof(SysUserMod));
|
||||
var tails = tableRoute.GetTails();
|
||||
var virtualTableRoute = (ITailAppendable)tableRoute;
|
||||
|
||||
//一定要先在路由里面添加尾巴
|
||||
virtualTableRoute.Append("20220921");
|
||||
shardingTableCreator.CreateTable<SysUserMod>("ds0","20220921");
|
||||
|
@ -129,6 +153,7 @@ namespace Sample.MySql.Controllers
|
|||
// {
|
||||
//
|
||||
// }
|
||||
|
||||
var dateTime = new DateTime(2021,1,1);
|
||||
var x211 = await (from ut in _defaultTableDbContext.Set<SysTest>().UseUnionAllMerge()
|
||||
join uu in _defaultTableDbContext.Set<SysUserLogByMonth>()
|
||||
|
|
|
@ -11,10 +11,15 @@ namespace Sample.MySql.Shardings
|
|||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override List<string> GetAllDataSourceNames()
|
||||
//只返回当前和历史
|
||||
private static readonly List<string> tails = new List<string>()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
"current",
|
||||
"history"
|
||||
};
|
||||
public override List<string> GetAllDataSourceNames()
|
||||
{
|
||||
return tails;
|
||||
}
|
||||
|
||||
public override bool AddDataSourceName(string dataSourceName)
|
||||
|
@ -29,6 +34,7 @@ namespace Sample.MySql.Shardings
|
|||
|
||||
public override Func<string, bool> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
//判断过滤查询历史还是现在
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ using Sample.MySql.Domain.Entities;
|
|||
using ShardingCore.Core.EntityMetadatas;
|
||||
using ShardingCore.Core.VirtualRoutes;
|
||||
using ShardingCore.Core.VirtualRoutes.DataSourceRoutes.RouteRuleEngine;
|
||||
using ShardingCore.Helpers;
|
||||
using ShardingCore.VirtualRoutes.Months;
|
||||
|
||||
namespace Sample.MySql.Shardings
|
||||
|
@ -41,27 +42,42 @@ namespace Sample.MySql.Shardings
|
|||
builder.ShardingProperty(o => o.Time);
|
||||
}
|
||||
|
||||
// protected override List<TableRouteUnit> AfterShardingRouteUnitFilter(DataSourceRouteResult dataSourceRouteResult, List<TableRouteUnit> shardingRouteUnits)
|
||||
// {
|
||||
// if (shardingRouteUnits.Count > 10)
|
||||
// {
|
||||
// _logger.LogInformation("截断前:"+string.Join(",",shardingRouteUnits.Select(o=>o.Tail)));
|
||||
// //这边你要自己做顺序处理阶段
|
||||
// var result= shardingRouteUnits.OrderByDescending(o=>o.Tail).Take(10).ToList();
|
||||
// _logger.LogInformation("截断后:"+string.Join(",",result.Select(o=>o.Tail)));
|
||||
// return result;
|
||||
// }
|
||||
// return base.AfterShardingRouteUnitFilter(dataSourceRouteResult, shardingRouteUnits);
|
||||
// }
|
||||
|
||||
protected override List<TableRouteUnit> AfterShardingRouteUnitFilter(DataSourceRouteResult dataSourceRouteResult, List<TableRouteUnit> shardingRouteUnits)
|
||||
protected override bool RouteIgnoreDataSource => false;
|
||||
public override Func<string, bool> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator)
|
||||
{
|
||||
Console.WriteLine("AfterShardingRouteUnitFilter:"+shardingRouteUnits.Count);
|
||||
if (shardingRouteUnits.Count > 10)//如果本次命中表过多
|
||||
var currentMonthFirstDay = ShardingCoreHelper.GetCurrentMonthFirstDay(DateTime.Now);
|
||||
var matchDataSource = currentMonthFirstDay<shardingKey?"history":"current";
|
||||
var t = TimeFormatToTail(shardingKey);
|
||||
switch (shardingOperator)
|
||||
{
|
||||
return shardingRouteUnits.Take(10).ToList();//自己排序截断选择最新的10张自己加orderBy
|
||||
case ShardingOperatorEnum.GreaterThan:
|
||||
case ShardingOperatorEnum.GreaterThanOrEqual:
|
||||
return tail =>
|
||||
{
|
||||
var strings = tail.Split(".");
|
||||
var ds = strings[0];
|
||||
var yyyyMM = strings[1];
|
||||
return matchDataSource==ds && String.Compare(yyyyMM, t, StringComparison.Ordinal) >= 0;
|
||||
};
|
||||
case ShardingOperatorEnum.LessThan:
|
||||
{
|
||||
var currentMonth = ShardingCoreHelper.GetCurrentMonthFirstDay(shardingKey);
|
||||
//处于临界值 o=>o.time < [2021-01-01 00:00:00] 尾巴20210101不应该被返回
|
||||
if (currentMonth == shardingKey)
|
||||
return tail => String.Compare(tail, t, StringComparison.Ordinal) < 0;
|
||||
return tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0;
|
||||
}
|
||||
case ShardingOperatorEnum.LessThanOrEqual:
|
||||
return tail => String.Compare(tail, t, StringComparison.Ordinal) <= 0;
|
||||
case ShardingOperatorEnum.Equal: return tail => tail == t;
|
||||
default:
|
||||
{
|
||||
#if DEBUG
|
||||
Console.WriteLine($"shardingOperator is not equal scan all table tail");
|
||||
#endif
|
||||
return tail => true;
|
||||
}
|
||||
}
|
||||
return base.AfterShardingRouteUnitFilter(dataSourceRouteResult, shardingRouteUnits);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -159,6 +159,12 @@ namespace Sample.MySql
|
|||
builder
|
||||
.AddInterceptors(new MySaveChangeInterceptor());
|
||||
});
|
||||
o.AddDefaultDataSource("current",
|
||||
"server=127.0.0.1;port=3306;database=dbdbd0;userid=root;password=root;");
|
||||
o.AddExtraDataSource(sp => new Dictionary<string, string>()
|
||||
{
|
||||
{ "history", "server=127.0.0.1;port=3306;database=dbdbd1;userid=root;password=root;" }
|
||||
});
|
||||
o.AddDefaultDataSource("ds0",
|
||||
"server=127.0.0.1;port=3306;database=dbdbd0;userid=root;password=root;");
|
||||
o.AddExtraDataSource(sp => new Dictionary<string, string>()
|
||||
|
|
|
@ -41,19 +41,19 @@ namespace ShardingCore.Sharding.EntityQueryConfigurations
|
|||
/// <summary>
|
||||
/// 使用当前属性order和comparer有关联
|
||||
/// ShardingTailComparer参数 tailComparer如果是正序,reverse是false那么表示ShardingTailComparer最后采用倒序
|
||||
/// whenAscIsSameAsShardingTailComparer,true表示当前添加的属性也是采用倒序,false表示当前添加的属性使用正序
|
||||
/// sameAsShardingTailComparer,true表示当前添加的属性也是采用倒序,false表示当前添加的属性使用正序
|
||||
/// 如果不添加AddOrder方法默认采用ShardingTailComparer在这个例子里就是倒序
|
||||
/// </summary>
|
||||
/// <typeparam name="TProperty"></typeparam>
|
||||
/// <param name="primaryOrderPropertyExpression"></param>
|
||||
/// <param name="whenAscIsSameAsShardingTailComparer">
|
||||
/// <param name="sameAsShardingTailComparer">
|
||||
/// true:当前属性正序和comparer正序一样,false:当前属性倒序和comparer正序一样
|
||||
/// </param>
|
||||
/// <param name="seqOrderMatch"></param>
|
||||
/// <returns></returns>
|
||||
public EntityQueryBuilder<TEntity> AddOrder<TProperty>(Expression<Func<TEntity, TProperty>> primaryOrderPropertyExpression,bool whenAscIsSameAsShardingTailComparer = true,SeqOrderMatchEnum seqOrderMatch=SeqOrderMatchEnum.Owner)
|
||||
public EntityQueryBuilder<TEntity> AddOrder<TProperty>(Expression<Func<TEntity, TProperty>> primaryOrderPropertyExpression,bool sameAsShardingTailComparer = true,SeqOrderMatchEnum seqOrderMatch=SeqOrderMatchEnum.Owner)
|
||||
{
|
||||
_entityQueryMetadata.AddSeqComparerOrder(primaryOrderPropertyExpression.GetPropertyAccess().Name, whenAscIsSameAsShardingTailComparer, seqOrderMatch);
|
||||
_entityQueryMetadata.AddSeqComparerOrder(primaryOrderPropertyExpression.GetPropertyAccess().Name, sameAsShardingTailComparer, seqOrderMatch);
|
||||
return this;
|
||||
}
|
||||
/// <summary>
|
||||
|
|
|
@ -106,6 +106,7 @@ namespace ShardingCore.Test
|
|||
}
|
||||
};
|
||||
}, ReadStrategyEnum.Loop, defaultEnable: false, readConnStringGetStrategy: ReadConnStringGetStrategyEnum.LatestEveryTime);
|
||||
|
||||
})
|
||||
.AddShardingCore();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue