[#179] 将ShardingQueryCompiler继承父类QueryCompiler,而不是直接实现IQueryCompiler,这样可以保证未分片的表使用zzz不需要处理修改还是支持的,仅分片表处理需要特殊考虑
This commit is contained in:
parent
1d15a8dc6a
commit
9c60ad3924
|
@ -1,6 +1,11 @@
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Query.Internal;
|
||||||
|
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
||||||
|
using ShardingCore.EFCores;
|
||||||
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
|
using ShardingCore.Sharding;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore6x.ShardingDbContexts;
|
using ShardingCore6x.ShardingDbContexts;
|
||||||
using Z.EntityFramework.Plus;
|
using Z.EntityFramework.Plus;
|
||||||
|
@ -70,5 +75,45 @@ namespace ShardingCore6x
|
||||||
|
|
||||||
return effectRows;
|
return effectRows;
|
||||||
}
|
}
|
||||||
|
// public static async Task<int> ShardingBulkUpdateAsync2<T>(this IQueryable<T> queryable,
|
||||||
|
// Expression<Func<T, T>> updateFactory,
|
||||||
|
// CancellationToken cancellationToken = default(CancellationToken)) where T : class
|
||||||
|
// {
|
||||||
|
// var shardingDbContext = GetShardingDbContext(queryable);
|
||||||
|
// var shardingRuntimeContext = ((DbContext)shardingDbContext).GetShardingRuntimeContext();
|
||||||
|
// var tableRouteManager = shardingRuntimeContext.GetTableRouteManager();
|
||||||
|
// var routeTailFactory = shardingRuntimeContext.GetRouteTailFactory();
|
||||||
|
// var virtualDataSource = shardingRuntimeContext.GetVirtualDataSource();
|
||||||
|
// var tableRouteUnits = tableRouteManager.RouteTo(typeof(T),virtualDataSource.DefaultDataSourceName,new ShardingTableRouteConfig(queryable:queryable));
|
||||||
|
// tableRouteUnits.Select(tableRouteUnit =>
|
||||||
|
// {
|
||||||
|
// var dbContext = shardingDbContext.GetDbContext(tableRouteUnit.DataSourceName,
|
||||||
|
// CreateDbContextStrategyEnum.ShareConnection, routeTailFactory.Create(tableRouteUnit.Tail));
|
||||||
|
// queryable.Expression.re
|
||||||
|
// })
|
||||||
|
// var dbContexts = shardingDbContext.BulkShardingTableExpression(where);
|
||||||
|
// var effectRows = 0;
|
||||||
|
// foreach (var dbContext in dbContexts)
|
||||||
|
// {
|
||||||
|
// effectRows += await dbContext.Set<T>().Where(where)
|
||||||
|
// .UpdateAsync(updateFactory, cancellationToken: cancellationToken);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return effectRows;
|
||||||
|
// }
|
||||||
|
// private static IShardingDbContext GetShardingDbContext<T>(IQueryable<T> source)
|
||||||
|
// {
|
||||||
|
//
|
||||||
|
// var entityQueryProvider = source.Provider as EntityQueryProvider??throw new ShardingCoreInvalidOperationException($"cant use sharding page that {nameof(IQueryable)} provider not {nameof(EntityQueryProvider)}");
|
||||||
|
//
|
||||||
|
// var shardingQueryCompiler = ObjectExtension.GetFieldValue(entityQueryProvider,"_queryCompiler") as ShardingQueryCompiler??throw new ShardingCoreInvalidOperationException($"cant use sharding page that {nameof(EntityQueryProvider)} not contains {nameof(ShardingQueryCompiler)} filed named _queryCompiler");
|
||||||
|
// var dbContextAvailable = shardingQueryCompiler as IShardingDbContextAvailable;
|
||||||
|
// if (dbContextAvailable == null)
|
||||||
|
// {
|
||||||
|
// throw new ShardingCoreInvalidOperationException($"cant use sharding page that {nameof(ShardingQueryCompiler)} not impl {nameof(IShardingDbContextAvailable)}");
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return dbContextAvailable.GetShardingDbContext();
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
:start
|
:start
|
||||||
::定义版本
|
::定义版本
|
||||||
set SHARDINGCORE7=7.0.0.1
|
set SHARDINGCORE7=7.0.0.2
|
||||||
set SHARDINGCORE2_6=6.8.0.6
|
set SHARDINGCORE2_6=6.8.0.7
|
||||||
|
|
||||||
::删除所有bin与obj下的文件
|
::删除所有bin与obj下的文件
|
||||||
@echo off
|
@echo off
|
||||||
|
|
|
@ -11,6 +11,9 @@ using System.Linq.Expressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Diagnostics;
|
||||||
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage;
|
||||||
using ShardingCore.Core;
|
using ShardingCore.Core;
|
||||||
using ShardingCore.Core.RuntimeContexts;
|
using ShardingCore.Core.RuntimeContexts;
|
||||||
|
|
||||||
|
@ -20,17 +23,32 @@ namespace ShardingCore.EFCores
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 当前查询编译拦截
|
/// 当前查询编译拦截
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ShardingQueryCompiler : IQueryCompiler,IShardingDbContextAvailable
|
public class ShardingQueryCompiler : QueryCompiler,IShardingDbContextAvailable
|
||||||
{
|
{
|
||||||
private readonly IShardingDbContext _shardingDbContext;
|
private readonly IShardingDbContext _shardingDbContext;
|
||||||
private readonly IShardingCompilerExecutor _shardingCompilerExecutor;
|
private readonly IShardingCompilerExecutor _shardingCompilerExecutor;
|
||||||
|
|
||||||
public ShardingQueryCompiler(ICurrentDbContext currentContext,IShardingRuntimeContext shardingRuntimeContext)
|
#if !NETCOREAPP2_0
|
||||||
|
public ShardingQueryCompiler(IShardingRuntimeContext shardingRuntimeContext,IQueryContextFactory queryContextFactory, ICompiledQueryCache compiledQueryCache, ICompiledQueryCacheKeyGenerator compiledQueryCacheKeyGenerator, IDatabase database, IDiagnosticsLogger<DbLoggerCategory.Query> logger, ICurrentDbContext currentContext, IEvaluatableExpressionFilter evaluatableExpressionFilter, IModel model)
|
||||||
|
: base(queryContextFactory, compiledQueryCache, compiledQueryCacheKeyGenerator, database, logger, currentContext, evaluatableExpressionFilter, model)
|
||||||
{
|
{
|
||||||
_shardingDbContext = currentContext.Context as IShardingDbContext ??
|
_shardingDbContext = currentContext.Context as IShardingDbContext ??
|
||||||
throw new ShardingCoreException("db context operator is not IShardingDbContext");
|
throw new ShardingCoreException("db context operator is not IShardingDbContext");
|
||||||
_shardingCompilerExecutor = shardingRuntimeContext.GetShardingCompilerExecutor();
|
_shardingCompilerExecutor = shardingRuntimeContext.GetShardingCompilerExecutor();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if NETCOREAPP2_0
|
||||||
|
|
||||||
|
|
||||||
|
public ShardingQueryCompiler(IShardingRuntimeContext shardingRuntimeContext,IQueryContextFactory queryContextFactory, ICompiledQueryCache compiledQueryCache, ICompiledQueryCacheKeyGenerator compiledQueryCacheKeyGenerator, IDatabase database, IDiagnosticsLogger<DbLoggerCategory.Query> logger, ICurrentDbContext currentContext, IQueryModelGenerator queryModelGenerator)
|
||||||
|
: base(queryContextFactory, compiledQueryCache, compiledQueryCacheKeyGenerator, database, logger, currentContext, queryModelGenerator)
|
||||||
|
{
|
||||||
|
_shardingDbContext = currentContext.Context as IShardingDbContext ??
|
||||||
|
throw new ShardingCoreException("db context operator is not IShardingDbContext");
|
||||||
|
_shardingCompilerExecutor = shardingRuntimeContext.GetShardingCompilerExecutor();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
public TResult Execute<TResult>(Expression query)
|
public TResult Execute<TResult>(Expression query)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue