添加自定义排序实现
This commit is contained in:
parent
c1e1042e1a
commit
e7ca85d25e
|
@ -30,6 +30,11 @@ namespace ShardingCore.DIExtensions
|
|||
_shardingCoreConfigBuilder = shardingCoreConfigBuilder;
|
||||
}
|
||||
|
||||
public ShardingCoreConfigEndBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
|
||||
{
|
||||
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
|
||||
return this;
|
||||
}
|
||||
public IServiceCollection End()
|
||||
{
|
||||
var services = _shardingCoreConfigBuilder.Services;
|
||||
|
@ -50,6 +55,14 @@ namespace ShardingCore.DIExtensions
|
|||
.AddSingleton<IShardingDbContextCreatorConfig,
|
||||
DefaultShardingDbContextCreatorConfig<TShardingDbContext>>(sp =>
|
||||
new DefaultShardingDbContextCreatorConfig<TShardingDbContext>());
|
||||
if (_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparerFactory != null)
|
||||
{
|
||||
services.AddSingleton<IShardingComparer<TShardingDbContext>>(_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparerFactory);
|
||||
}
|
||||
else
|
||||
{
|
||||
services.AddSingleton<IShardingComparer<TShardingDbContext>, CSharpLanguageShardingComparer<TShardingDbContext>>();
|
||||
}
|
||||
|
||||
if (!_shardingCoreConfigBuilder.ShardingConfigOption.UseReadWrite)
|
||||
{
|
||||
|
@ -94,6 +107,7 @@ namespace ShardingCore.DIExtensions
|
|||
|
||||
services.TryAddSingleton<IShardingReadWriteManager, ShardingReadWriteManager>();
|
||||
services.AddSingleton<IShardingReadWriteAccessor, ShardingReadWriteAccessor<TShardingDbContext>>();
|
||||
|
||||
//foreach (var dataSourceKv in dataSources)
|
||||
//{
|
||||
// if (dataSourceKv.Key == _shardingCoreConfigBuilder.DefaultDataSourceName)
|
||||
|
|
|
@ -40,5 +40,10 @@ namespace ShardingCore.DIExtensions
|
|||
}
|
||||
return new ShardingReadWriteSeparationBuilder<TShardingDbContext>(_shardingCoreConfigBuilder);
|
||||
}
|
||||
public ShardingDataBaseOrTableBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
|
||||
{
|
||||
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,5 +36,10 @@ namespace ShardingCore.DIExtensions
|
|||
|
||||
return new ShardingTableBuilder<TShardingDbContext>(_shardingCoreConfigBuilder);
|
||||
}
|
||||
public ShardingDataSourceRouteBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
|
||||
{
|
||||
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,5 +34,10 @@ namespace ShardingCore.DIExtensions
|
|||
_shardingCoreConfigBuilder.ShardingConfigOption.UseReadWriteConfiguration(readWriteSeparationConfigure,readStrategyEnum, defaultEnable,defaultPriority);
|
||||
return new ShardingCoreConfigEndBuilder<TShardingDbContext>(_shardingCoreConfigBuilder);
|
||||
}
|
||||
public ShardingReadWriteSeparationBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
|
||||
{
|
||||
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,5 +35,10 @@ namespace ShardingCore.DIExtensions
|
|||
}
|
||||
return new ShardingReadWriteSeparationBuilder<TShardingDbContext>(_shardingCoreConfigBuilder);
|
||||
}
|
||||
public ShardingTableBuilder<TShardingDbContext> ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
|
||||
{
|
||||
_shardingCoreConfigBuilder.ShardingConfigOption.ReplaceShardingComparer(newShardingComparerFactory);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
using System;
|
||||
|
||||
namespace ShardingCore.Extensions
|
||||
{
|
||||
/*
|
||||
* @Author: xjm
|
||||
* @Description:
|
||||
* @Date: Sunday, 31 October 2021 15:41:12
|
||||
* @Email: 326308290@qq.com
|
||||
*/
|
||||
public static class ComparableExtension
|
||||
{
|
||||
public static int SafeCompareToWith(this IComparable value, IComparable other, bool asc)
|
||||
{
|
||||
if (asc)
|
||||
return SafeCompareTo(value, other);
|
||||
return SafeCompareTo(other, value);
|
||||
}
|
||||
public static int SafeCompareTo(IComparable value, IComparable other)
|
||||
{
|
||||
if (null == value && null == other) {
|
||||
return 0;
|
||||
}
|
||||
if (null == value)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (null == other) {
|
||||
return 1;
|
||||
}
|
||||
return value.CompareTo(other);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace ShardingCore.Sharding.Abstractions
|
||||
{
|
||||
/*
|
||||
* @Author: xjm
|
||||
* @Description:
|
||||
* @Date: Sunday, 31 October 2021 15:07:52
|
||||
* @Email: 326308290@qq.com
|
||||
*/
|
||||
public interface IShardingComparer
|
||||
{
|
||||
int Compare(IComparable a, IComparable b,bool asc);
|
||||
}
|
||||
|
||||
public interface IShardingComparer<TShardingDbContext> : IShardingComparer where TShardingDbContext:DbContext,IShardingDbContext
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using ShardingCore.Extensions;
|
||||
using ShardingCore.Sharding.Abstractions;
|
||||
|
||||
namespace ShardingCore.Sharding
|
||||
{
|
||||
/*
|
||||
* @Author: xjm
|
||||
* @Description:
|
||||
* @Date: Sunday, 31 October 2021 15:39:46
|
||||
* @Email: 326308290@qq.com
|
||||
*/
|
||||
public class CSharpLanguageShardingComparer<TShardingDbContext>:IShardingComparer<TShardingDbContext> where TShardingDbContext:DbContext,IShardingDbContext
|
||||
{
|
||||
public int Compare(IComparable a, IComparable b, bool asc)
|
||||
{
|
||||
return a.SafeCompareToWith(b, asc);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -115,7 +115,7 @@ namespace ShardingCore.Sharding.Enumerators
|
|||
int i = 0;
|
||||
foreach (var order in _mergeContext.Orders)
|
||||
{
|
||||
int result = CompareHelper.CompareToWith(_orderValues[i], other.GetCompares()[i], order.IsAsc);
|
||||
int result = _mergeContext.GetShardingComparer().Compare(_orderValues[i], other.GetCompares()[i], order.IsAsc);
|
||||
if (0 != result)
|
||||
{
|
||||
return result;
|
||||
|
|
|
@ -47,19 +47,19 @@ namespace ShardingCore.Sharding
|
|||
public IEnumerable<TableRouteResult> TableRouteResults { get; }
|
||||
public DataSourceRouteResult DataSourceRouteResult { get; }
|
||||
/// <summary>
|
||||
/// 本次查询涉及的对象
|
||||
/// 本次查询涉及的对象
|
||||
/// </summary>
|
||||
public ISet<Type> QueryEntities { get; }
|
||||
/// <summary>
|
||||
/// 本次查询是否包含notracking
|
||||
/// 本次查询是否包含notracking
|
||||
/// </summary>
|
||||
public bool? IsNoTracking { get; }
|
||||
/// <summary>
|
||||
/// 本次查询跨库
|
||||
/// 本次查询跨库
|
||||
/// </summary>
|
||||
public bool IsCrossDataSource { get; }
|
||||
/// <summary>
|
||||
/// 本次查询跨表
|
||||
/// 本次查询跨表
|
||||
/// </summary>
|
||||
public bool IsCrossTable { get; }
|
||||
|
||||
|
@ -68,6 +68,8 @@ namespace ShardingCore.Sharding
|
|||
|
||||
private readonly ConcurrentDictionary<DbContext, object> _parallelDbContexts;
|
||||
|
||||
private readonly IShardingComparer _shardingComparer;
|
||||
|
||||
public StreamMergeContext(IQueryable<T> source, IShardingDbContext shardingDbContext,
|
||||
DataSourceRouteResult dataSourceRouteResult,
|
||||
IEnumerable<TableRouteResult> tableRouteResults,
|
||||
|
@ -93,6 +95,8 @@ namespace ShardingCore.Sharding
|
|||
_trackerManager =
|
||||
(ITrackerManager)ShardingContainer.GetService(
|
||||
typeof(ITrackerManager<>).GetGenericType0(shardingDbContext.GetType()));
|
||||
_shardingComparer = (IShardingComparer)ShardingContainer.GetService(typeof(IShardingComparer<>).GetGenericType0(_shardingDbContext.GetType()));
|
||||
|
||||
_shardingConfigOption = ShardingContainer.GetServices<IShardingConfigOption>()
|
||||
.FirstOrDefault(o => o.ShardingDbContextType == shardingDbContext.GetType());
|
||||
_parallelDbContexts = new ConcurrentDictionary<DbContext, object>();
|
||||
|
@ -123,7 +127,7 @@ namespace ShardingCore.Sharding
|
|||
Skip = skip;
|
||||
}
|
||||
/// <summary>
|
||||
/// 创建对应的dbcontext
|
||||
/// 创建对应的dbcontext
|
||||
/// </summary>
|
||||
/// <param name="dataSourceName">data source name</param>
|
||||
/// <param name="tableRouteResult"></param>
|
||||
|
@ -131,7 +135,7 @@ namespace ShardingCore.Sharding
|
|||
public DbContext CreateDbContext(string dataSourceName, TableRouteResult tableRouteResult)
|
||||
{
|
||||
var routeTail = _routeTailFactory.Create(tableRouteResult);
|
||||
//如果开启了读写分离或者本次查询是跨表或者跨库的表示本次查询的dbcontext是不存储的用完后就直接dispose
|
||||
//如果开启了读写分离或者本次查询是跨表或者跨库的表示本次查询的dbcontext是不存储的用完后就直接dispose
|
||||
var parallelQuery = IsParallelQuery();
|
||||
var dbContext = _shardingDbContext.GetDbContext(dataSourceName, parallelQuery, routeTail);
|
||||
if (parallelQuery)
|
||||
|
@ -190,7 +194,7 @@ namespace ShardingCore.Sharding
|
|||
return _shardingConfigOption.ParallelQueryTimeOut;
|
||||
}
|
||||
/// <summary>
|
||||
/// 是否是跨资源查询
|
||||
/// 是否是跨资源查询
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool IsCrossQuery()
|
||||
|
@ -198,7 +202,7 @@ namespace ShardingCore.Sharding
|
|||
return IsCrossDataSource || IsCrossTable;
|
||||
}
|
||||
/// <summary>
|
||||
/// 是否启用读写分离
|
||||
/// 是否启用读写分离
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool IsUseReadWriteSeparation()
|
||||
|
@ -207,7 +211,7 @@ namespace ShardingCore.Sharding
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否使用并行查询
|
||||
/// 是否使用并行查询
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool IsParallelQuery()
|
||||
|
@ -216,12 +220,12 @@ namespace ShardingCore.Sharding
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 是否使用sharding track
|
||||
/// 是否使用sharding track
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public bool IsUseShardingTrack(Type entityType)
|
||||
{
|
||||
//没有跨dbcontext查询并且不是读写分离才可以那么是否追踪之类的由查询的dbcontext自行处理
|
||||
//没有跨dbcontext查询并且不是读写分离才可以那么是否追踪之类的由查询的dbcontext自行处理
|
||||
if (!IsParallelQuery())
|
||||
return false;
|
||||
return QueryTrack() && _trackerManager.EntityUseTrack(entityType);
|
||||
|
@ -242,6 +246,10 @@ namespace ShardingCore.Sharding
|
|||
}
|
||||
}
|
||||
|
||||
public IShardingComparer GetShardingComparer()
|
||||
{
|
||||
return _shardingComparer;
|
||||
}
|
||||
public void Dispose()
|
||||
{
|
||||
foreach (var dbContext in _parallelDbContexts.Keys)
|
||||
|
|
|
@ -43,6 +43,16 @@ namespace ShardingCore
|
|||
{
|
||||
DataSourcesConfigure = dataSourcesConfigure ?? throw new ArgumentNullException(nameof(dataSourcesConfigure));
|
||||
}
|
||||
public Func<IServiceProvider, IShardingComparer<TShardingDbContext>> ReplaceShardingComparerFactory { get; private set; }
|
||||
/// <summary>
|
||||
/// 替换默认的比较器
|
||||
/// </summary>
|
||||
/// <param name="newShardingComparerFactory"></param>
|
||||
/// <exception cref="ArgumentNullException"></exception>
|
||||
public void ReplaceShardingComparer(Func<IServiceProvider, IShardingComparer<TShardingDbContext>> newShardingComparerFactory)
|
||||
{
|
||||
ReplaceShardingComparerFactory=newShardingComparerFactory ?? throw new ArgumentNullException(nameof(newShardingComparerFactory));
|
||||
}
|
||||
|
||||
|
||||
///// <summary>
|
||||
|
|
Loading…
Reference in New Issue