diff --git a/ShardingCore.sln b/ShardingCore.sln index 1354dc73..24850d97 100644 --- a/ShardingCore.sln +++ b/ShardingCore.sln @@ -35,7 +35,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.AbpSharding", "samp EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShardingCore.Test50_3x", "test\ShardingCore.Test50_3x\ShardingCore.Test50_3x.csproj", "{C0A59BB0-F0B8-4AC6-B192-0249E784FC88}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShardingCore.Test50_2x", "test\ShardingCore.Test50_2x\ShardingCore.Test50_2x.csproj", "{6709DD6A-6A44-4A49-BA4D-A50A40102C8B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShardingCore.Test50_2x", "test\ShardingCore.Test50_2x\ShardingCore.Test50_2x.csproj", "{6709DD6A-6A44-4A49-BA4D-A50A40102C8B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.BulkConsole", "samples\Sample.BulkConsole\Sample.BulkConsole.csproj", "{2443CC8B-FB7D-47A7-9663-F3848BB30A36}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -91,6 +93,10 @@ Global {6709DD6A-6A44-4A49-BA4D-A50A40102C8B}.Debug|Any CPU.Build.0 = Debug|Any CPU {6709DD6A-6A44-4A49-BA4D-A50A40102C8B}.Release|Any CPU.ActiveCfg = Release|Any CPU {6709DD6A-6A44-4A49-BA4D-A50A40102C8B}.Release|Any CPU.Build.0 = Release|Any CPU + {2443CC8B-FB7D-47A7-9663-F3848BB30A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2443CC8B-FB7D-47A7-9663-F3848BB30A36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2443CC8B-FB7D-47A7-9663-F3848BB30A36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2443CC8B-FB7D-47A7-9663-F3848BB30A36}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -108,6 +114,7 @@ Global {1136B8C9-3539-42FA-97FD-CAA6F146FCF0} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73} {C0A59BB0-F0B8-4AC6-B192-0249E784FC88} = {CC2C88C0-65F2-445D-BE78-973B840FE281} {6709DD6A-6A44-4A49-BA4D-A50A40102C8B} = {CC2C88C0-65F2-445D-BE78-973B840FE281} + {2443CC8B-FB7D-47A7-9663-F3848BB30A36} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8C07A667-E8B4-43C7-8053-721584BAD291} diff --git a/nuget-publish.bat b/nuget-publish.bat index 1f5cc58e..22271761 100644 --- a/nuget-publish.bat +++ b/nuget-publish.bat @@ -1,8 +1,8 @@ :start ::定义版本 -set EFCORE2=2.2.0.20-pre1 -set EFCORE3=3.2.0.20-pre1 -set EFCORE5=5.2.0.20-pre1 +set EFCORE2=2.2.0.20-pre2 +set EFCORE3=3.2.0.20-pre2 +set EFCORE5=5.2.0.20-pre2 ::删除所有bin与obj下的文件 @echo off diff --git a/samples/Sample.BulkConsole/DbContexts/MyDbContext.cs b/samples/Sample.BulkConsole/DbContexts/MyDbContext.cs new file mode 100644 index 00000000..d0137e41 --- /dev/null +++ b/samples/Sample.BulkConsole/DbContexts/MyDbContext.cs @@ -0,0 +1,35 @@ +using Microsoft.EntityFrameworkCore; +using Sample.BulkConsole.Entities; +using ShardingCore.Core.VirtualRoutes.RouteTails.Abstractions; +using ShardingCore.Sharding.Abstractions; + +namespace Sample.BulkConsole.DbContexts +{ + /* + * @Author: xjm + * @Description: + * @Date: 2021/9/7 21:07:19 + * @Ver: 1.0 + * @Email: 326308290@qq.com + */ + public class MyDbContext: DbContext,IShardingTableDbContext + { + public MyDbContext(DbContextOptions myDbContextOptions):base(myDbContextOptions) + { + + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity(entity => + { + entity.HasKey(o => o.Id); + entity.Property(o => o.OrderNo).IsRequired().HasMaxLength(128).IsUnicode(false); + entity.ToTable(nameof(Order)); + }); + } + + public IRouteTail RouteTail { get; set; } + } +} diff --git a/samples/Sample.BulkConsole/DbContexts/MyShardingDbContext.cs b/samples/Sample.BulkConsole/DbContexts/MyShardingDbContext.cs new file mode 100644 index 00000000..8862bcda --- /dev/null +++ b/samples/Sample.BulkConsole/DbContexts/MyShardingDbContext.cs @@ -0,0 +1,34 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Sample.BulkConsole.Entities; +using ShardingCore.Sharding; + +namespace Sample.BulkConsole.DbContexts +{ + /* + * @Author: xjm + * @Description: + * @Date: 2021/9/7 21:12:12 + * @Ver: 1.0 + * @Email: 326308290@qq.com + */ + public class MyShardingDbContext:AbstractShardingDbContext + { + public MyShardingDbContext(DbContextOptions options) : base(options) + { + } + + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity(entity => + { + entity.HasKey(o => o.Id); + entity.Property(o => o.OrderNo).IsRequired().HasMaxLength(128).IsUnicode(false); + entity.ToTable(nameof(Order)); + }); + } + public override Type ShardingDbContextType => this.GetType(); + } +} diff --git a/samples/Sample.BulkConsole/Entities/Order.cs b/samples/Sample.BulkConsole/Entities/Order.cs new file mode 100644 index 00000000..e4b3d772 --- /dev/null +++ b/samples/Sample.BulkConsole/Entities/Order.cs @@ -0,0 +1,21 @@ +using System; +using ShardingCore.Core; + +namespace Sample.BulkConsole.Entities +{ + /* + * @Author: xjm + * @Description: + * @Date: 2021/9/7 21:08:43 + * @Ver: 1.0 + * @Email: 326308290@qq.com + */ + public class Order:IShardingTable + { + public string Id { get; set; } + public string OrderNo { get; set; } + public int Seq { get; set; } + [ShardingTableKey] + public DateTime CreateTime { get; set; } + } +} diff --git a/samples/Sample.BulkConsole/OrderPaginationConfiguration.cs b/samples/Sample.BulkConsole/OrderPaginationConfiguration.cs new file mode 100644 index 00000000..052dc7e3 --- /dev/null +++ b/samples/Sample.BulkConsole/OrderPaginationConfiguration.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Sample.BulkConsole.Entities; +using ShardingCore.Sharding.PaginationConfigurations; + +namespace Sample.BulkConsole +{ + /* + * @Author: xjm + * @Description: + * @Date: 2021/9/8 10:29:22 + * @Ver: 1.0 + * @Email: 326308290@qq.com + */ + public class OrderPaginationConfiguration:IPaginationConfiguration + { + public void Configure(PaginationBuilder builder) + { + builder.PaginationSequence(o => o.CreateTime); + } + } +} diff --git a/samples/Sample.BulkConsole/OrderVirtualRoute.cs b/samples/Sample.BulkConsole/OrderVirtualRoute.cs new file mode 100644 index 00000000..c86b3a2a --- /dev/null +++ b/samples/Sample.BulkConsole/OrderVirtualRoute.cs @@ -0,0 +1,27 @@ +using System; +using Sample.BulkConsole.Entities; +using ShardingCore.Sharding.PaginationConfigurations; +using ShardingCore.VirtualRoutes.Days; + +namespace Sample.BulkConsole +{ + /* + * @Author: xjm + * @Description: + * @Date: 2021/9/7 21:16:47 + * @Ver: 1.0 + * @Email: 326308290@qq.com + */ + public class OrderVirtualRoute:AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute + { + public override DateTime GetBeginTime() + { + return DateTime.Now.Date.AddDays(-3); + } + + public override IPaginationConfiguration CreatePaginationConfiguration() + { + return new OrderPaginationConfiguration(); + } + } +} diff --git a/samples/Sample.BulkConsole/Program.cs b/samples/Sample.BulkConsole/Program.cs new file mode 100644 index 00000000..4639a64a --- /dev/null +++ b/samples/Sample.BulkConsole/Program.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using EFCore.BulkExtensions; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Sample.BulkConsole.DbContexts; +using Sample.BulkConsole.Entities; +using ShardingCore; +using ShardingCore.Extensions; + +namespace Sample.BulkConsole +{ + class Program + { + public static readonly ILoggerFactory efLogger = LoggerFactory.Create(builder => + { + builder.AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information).AddConsole(); + }); + static void Main(string[] args) + { + var services = new ServiceCollection(); + services.AddLogging(); + services.AddShardingDbContext( + o => o.UseSqlServer("Data Source=localhost;Initial Catalog=MyOrderSharding;Integrated Security=True;") + , op => + { + op.EnsureCreatedWithOutShardingTable = true; + op.CreateShardingTableOnStart = true; + op.UseShardingOptionsBuilder( + (connection, builder) => builder.UseSqlServer(connection),//使用dbconnection创建dbcontext支持事务 + (conStr, builder) => builder.UseSqlServer(conStr).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking) + ); + op.AddShardingTableRoute(); + }); + var serviceProvider = services.BuildServiceProvider(); + serviceProvider.GetService().Start(); + using (var serviceScope = serviceProvider.CreateScope()) + { + var myShardingDbContext = serviceScope.ServiceProvider.GetService(); + if (!myShardingDbContext.Set().Any()) + { + var begin = DateTime.Now.Date.AddDays(-3); + var now = DateTime.Now; + var current = begin; + ICollection orders = new LinkedList(); + int i = 0; + while (current < now) + { + orders.Add(new Order() + { + Id = i.ToString(), + OrderNo = $"orderno-" + i.ToString(), + Seq = i, + CreateTime = current + }); + i++; + current = current.AddMilliseconds(100); + } + + var startNew = Stopwatch.StartNew(); + var bulkShardingEnumerable = myShardingDbContext.BulkShardingEnumerable(orders); + startNew.Stop(); + Console.WriteLine($"订单总数:{i}条,myShardingDbContext.BulkShardingEnumerable(orders)用时:{startNew.ElapsedMilliseconds}毫秒"); + startNew.Restart(); + foreach (var keyValuePair in bulkShardingEnumerable) + { + keyValuePair.Key.BulkInsert(keyValuePair.Value.ToList()); + } + startNew.Stop(); + Console.WriteLine($"订单总数:{i}条,myShardingDbContext.BulkInsert(orders)用时:{startNew.ElapsedMilliseconds}毫秒"); + + Console.WriteLine("ok"); + } + var b = DateTime.Now.Date.AddDays(-2); + var queryable = myShardingDbContext.Set().Where(o => o.CreateTime >= b).OrderBy(o => o.CreateTime); + var startNew1 = Stopwatch.StartNew(); + + int skip = 0, take = 10; + for (int i = 10000; i < 20000; i++) + { + skip = take * i; + startNew1.Restart(); + var shardingPagedResult = queryable.ToShardingPage(i+1, take); + startNew1.Stop(); + Console.WriteLine($"流式分页skip:[{skip}],take:[{take}]耗时用时:{startNew1.ElapsedMilliseconds}毫秒"); + } + + Console.WriteLine("ok"); + + } + } + } +} diff --git a/samples/Sample.BulkConsole/Sample.BulkConsole.csproj b/samples/Sample.BulkConsole/Sample.BulkConsole.csproj new file mode 100644 index 00000000..8eabca04 --- /dev/null +++ b/samples/Sample.BulkConsole/Sample.BulkConsole.csproj @@ -0,0 +1,16 @@ + + + + Exe + net5.0 + + + + + + + + + + + diff --git a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs index 2a1b5dd2..1812d453 100644 --- a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs +++ b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs @@ -101,7 +101,7 @@ namespace Samples.AbpSharding throw new ShardingCoreException("multi route not support track"); if(!(routeTail is ISingleQueryRouteTail singleQueryRouteTail)) throw new ShardingCoreException("multi route not support track"); - var cacheKey = routeTail.GetRouteTailIdenty(); + var cacheKey = routeTail.GetRouteTailIdentity(); if (!_dbContextCaches.TryGetValue(cacheKey, out var dbContext)) { dbContext = _shardingDbContextFactory.Create(ShardingDbContextType, GetShareShardingDbContextOptions(routeTail)); diff --git a/src/ShardingCore/Core/VirtualRoutes/RouteTails/Abstractions/IRouteTail.cs b/src/ShardingCore/Core/VirtualRoutes/RouteTails/Abstractions/IRouteTail.cs index e4377eb6..0b645875 100644 --- a/src/ShardingCore/Core/VirtualRoutes/RouteTails/Abstractions/IRouteTail.cs +++ b/src/ShardingCore/Core/VirtualRoutes/RouteTails/Abstractions/IRouteTail.cs @@ -8,7 +8,7 @@ namespace ShardingCore.Core.VirtualRoutes.RouteTails.Abstractions */ public interface IRouteTail { - string GetRouteTailIdenty(); + string GetRouteTailIdentity(); bool IsMultiEntityQuery(); } } \ No newline at end of file diff --git a/src/ShardingCore/Core/VirtualRoutes/RouteTails/MultiQueryRouteTail.cs b/src/ShardingCore/Core/VirtualRoutes/RouteTails/MultiQueryRouteTail.cs index 2d09bf28..56e149de 100644 --- a/src/ShardingCore/Core/VirtualRoutes/RouteTails/MultiQueryRouteTail.cs +++ b/src/ShardingCore/Core/VirtualRoutes/RouteTails/MultiQueryRouteTail.cs @@ -27,7 +27,7 @@ namespace ShardingCore.Core.VirtualRoutes.RouteTails _modelCacheKey = RANDOM_MODEL_CACHE_KEY+Guid.NewGuid().ToString("n"); _entityTypes = routeResult.ReplaceTables.Select(o=>o.EntityType).ToHashSet(); } - public string GetRouteTailIdenty() + public string GetRouteTailIdentity() { return _modelCacheKey; } diff --git a/src/ShardingCore/Core/VirtualRoutes/RouteTails/SingleQueryRouteTail.cs b/src/ShardingCore/Core/VirtualRoutes/RouteTails/SingleQueryRouteTail.cs index d588e532..aa8a3f10 100644 --- a/src/ShardingCore/Core/VirtualRoutes/RouteTails/SingleQueryRouteTail.cs +++ b/src/ShardingCore/Core/VirtualRoutes/RouteTails/SingleQueryRouteTail.cs @@ -31,7 +31,7 @@ namespace ShardingCore.Core.VirtualRoutes.RouteTails _tail= tail; _modelCacheKey = _tail.FormatRouteTail2ModelCacheKey(); } - public virtual string GetRouteTailIdenty() + public virtual string GetRouteTailIdentity() { return _modelCacheKey; } diff --git a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingOperatorVirtualTableRoute.cs b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingOperatorVirtualTableRoute.cs index e6b0cb8d..102e7f0c 100644 --- a/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingOperatorVirtualTableRoute.cs +++ b/src/ShardingCore/Core/VirtualRoutes/TableRoutes/Abstractions/AbstractShardingOperatorVirtualTableRoute.cs @@ -1,20 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; using ShardingCore.Core.PhysicTables; using ShardingCore.Exceptions; using ShardingCore.Extensions; using ShardingCore.Utils; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Linq.Expressions; namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions { -/* -* @Author: xjm -* @Description: -* @Date: Saturday, 19 December 2020 19:55:24 -* @Email: 326308290@qq.com -*/ + /* + * @Author: xjm + * @Description: + * @Date: Saturday, 19 December 2020 19:55:24 + * @Email: 326308290@qq.com + */ public abstract class AbstractShardingOperatorVirtualTableRoute : AbstractShardingFilterVirtualTableRoute where T : class, IShardingTable { @@ -37,9 +38,9 @@ namespace ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions public override IPhysicTable RouteWithValue(List allPhysicTables, object shardingKey) { - var filter = GetRouteToFilter(ConvertToShardingKey(shardingKey), ShardingOperatorEnum.Equal).Compile(); + var shardingKeyToTail = ShardingKeyToTail(ConvertToShardingKey(shardingKey)); - var physicTables = allPhysicTables.Where(o => filter(o.Tail)).ToList(); + var physicTables = allPhysicTables.Where(o => o.Tail== shardingKeyToTail).ToList(); if (physicTables.IsEmpty()) { var routeConfig = ShardingKeyUtil.Parse(typeof(T)); diff --git a/src/ShardingCore/Core/VirtualTables/OneDbVirtualTable.cs b/src/ShardingCore/Core/VirtualTables/OneDbVirtualTable.cs index a27d8c1e..94c4e5ba 100644 --- a/src/ShardingCore/Core/VirtualTables/OneDbVirtualTable.cs +++ b/src/ShardingCore/Core/VirtualTables/OneDbVirtualTable.cs @@ -1,25 +1,23 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using Microsoft.Extensions.DependencyInjection; using ShardingCore.Core.PhysicTables; -using ShardingCore.Core.VirtualRoutes; using ShardingCore.Core.VirtualRoutes.TableRoutes; using ShardingCore.Exceptions; using ShardingCore.Extensions; using ShardingCore.Sharding.PaginationConfigurations; using ShardingCore.Utils; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; namespace ShardingCore.Core.VirtualTables { -/* -* @Author: xjm -* @Description: -* @Date: Friday, 18 December 2020 14:20:12 -* @Email: 326308290@qq.com -*/ + /* + * @Author: xjm + * @Description: + * @Date: Friday, 18 December 2020 14:20:12 + * @Email: 326308290@qq.com + */ /// /// 同数据库虚拟表 /// diff --git a/src/ShardingCore/EFCores/ShardingModelCacheKeyFactory.cs b/src/ShardingCore/EFCores/ShardingModelCacheKeyFactory.cs index 358b5cd8..be5815f6 100644 --- a/src/ShardingCore/EFCores/ShardingModelCacheKeyFactory.cs +++ b/src/ShardingCore/EFCores/ShardingModelCacheKeyFactory.cs @@ -17,10 +17,10 @@ namespace ShardingCore.EFCores { public object Create(DbContext context) { - if (context is IShardingTableDbContext shardingTableDbContext&&!string.IsNullOrWhiteSpace(shardingTableDbContext.RouteTail.GetRouteTailIdenty())) + if (context is IShardingTableDbContext shardingTableDbContext&&!string.IsNullOrWhiteSpace(shardingTableDbContext.RouteTail.GetRouteTailIdentity())) { - return $"{context.GetType()}_{shardingTableDbContext.RouteTail.GetRouteTailIdenty()}"; + return $"{context.GetType()}_{shardingTableDbContext.RouteTail.GetRouteTailIdentity()}"; } else { diff --git a/src/ShardingCore/Extensions/ShardingExtension.cs b/src/ShardingCore/Extensions/ShardingExtension.cs index 90b8a5b8..6bcc9270 100644 --- a/src/ShardingCore/Extensions/ShardingExtension.cs +++ b/src/ShardingCore/Extensions/ShardingExtension.cs @@ -1,10 +1,15 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Text; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using ShardingCore.Core; +using ShardingCore.Core.VirtualRoutes.RouteTails.Abstractions; +using ShardingCore.Core.VirtualRoutes.TableRoutes; +using ShardingCore.Core.VirtualTables; using ShardingCore.Exceptions; using ShardingCore.Sharding.Abstractions; @@ -54,14 +59,13 @@ namespace ShardingCore.Extensions { #if !EFCORE2 - return expression.Print(); + return expression.Print(); #endif #if EFCORE2 return expression.ToString(); #endif } - /// /// 根据对象集合解析 /// @@ -72,15 +76,59 @@ namespace ShardingCore.Extensions public static IDictionary> BulkShardingEnumerable(this IShardingDbContext shardingDbContext, IEnumerable entities) where TEntity : class { - return entities.Select(o => + var entityType = typeof(TEntity); + var routeTailFactory = ShardingContainer.GetService(); + if (!entityType.IsShardingTable()) { - var dbContext = shardingDbContext.CreateGenericDbContext(o); - return new + var routeTail = routeTailFactory.Create(string.Empty); + var dbContext = shardingDbContext.GetDbContext(true, routeTail); + return new Dictionary>() { - DbContext = dbContext, - Entity = o + {dbContext,entities } }; - }).GroupBy(g => g.DbContext).ToDictionary(o=>o.Key,o=>o.Select(g=>g.Entity)); + } + else + { + + var virtualTableManager = ShardingContainer.GetService(); + var virtualTable = virtualTableManager.GetVirtualTable(shardingDbContext.ShardingDbContextType, entityType); + + var virtualTableRoute = virtualTable.GetVirtualRoute(); + var hashSet = virtualTableRoute.GetAllTails().ToHashSet(); + var dic = new Dictionary>(); + foreach (var entity in entities) + { + var shardingKey = entity.GetPropertyValue(virtualTable.ShardingConfig.ShardingField); + var tail = virtualTableRoute.ShardingKeyToTail(shardingKey); + if (!hashSet.Contains(tail)) + throw new ShardingKeyRouteNotMatchException( + $"Entity:{entityType.FullName},ShardingKey:{shardingKey},ShardingTail:{tail}"); + + var routeTail = routeTailFactory.Create(tail); + var routeTailIdentity = routeTail.GetRouteTailIdentity(); + if (!dic.TryGetValue(routeTailIdentity, out var bulkDicEntry)) + { + var dbContext = shardingDbContext.GetDbContext(true, routeTail); + bulkDicEntry = new BulkDicEntry(dbContext, new LinkedList()); + dic.Add(routeTailIdentity, bulkDicEntry); + } + + bulkDicEntry.InnerEntities.AddLast(entity); + } + + return dic.Values.ToDictionary(o => o.InnerDbContext, o => o.InnerEntities.Select(t => t)); + } + } + internal class BulkDicEntry + { + public BulkDicEntry(DbContext innerDbContext, LinkedList innerEntities) + { + InnerDbContext = innerDbContext; + InnerEntities = innerEntities; + } + + public DbContext InnerDbContext { get; } + public LinkedList InnerEntities { get; } } /// /// 根据条件表达式解析 diff --git a/src/ShardingCore/Sharding/AbstractShardingDbContext.cs b/src/ShardingCore/Sharding/AbstractShardingDbContext.cs index 960b9c11..c5005785 100644 --- a/src/ShardingCore/Sharding/AbstractShardingDbContext.cs +++ b/src/ShardingCore/Sharding/AbstractShardingDbContext.cs @@ -34,7 +34,7 @@ namespace ShardingCore.Sharding /// 分表分库的dbcontext /// /// - public abstract class AbstractShardingDbContext : DbContext, IShardingDbContext, IShardingTransaction,IShardingReadWriteSupport where T : DbContext, IShardingTableDbContext + public abstract class AbstractShardingDbContext : DbContext, IShardingDbContext, IShardingTransaction, IShardingReadWriteSupport where T : DbContext, IShardingTableDbContext { private readonly ConcurrentDictionary _dbContextCaches = new ConcurrentDictionary(); private readonly IShardingConfigOption shardingConfigOption; @@ -55,12 +55,12 @@ namespace ShardingCore.Sharding _routeTailFactory = ShardingContainer.GetService(); _shardingDbContextOptionsBuilderConfig = ShardingContainer .GetService>() - .FirstOrDefault(o => o.ShardingDbContextType == ShardingDbContextType)??throw new ArgumentNullException(nameof(IShardingDbContextOptionsBuilderConfig)); + .FirstOrDefault(o => o.ShardingDbContextType == ShardingDbContextType) ?? throw new ArgumentNullException(nameof(IShardingDbContextOptionsBuilderConfig)); _connectionStringManager = ShardingContainer.GetService>() .FirstOrDefault(o => o.ShardingDbContextType == ShardingDbContextType) ?? throw new ArgumentNullException(nameof(IConnectionStringManager)); - shardingConfigOption =ShardingContainer.GetService>().FirstOrDefault(o=>o.ShardingDbContextType==ShardingDbContextType&&o.ActualDbContextType==typeof(T)) ?? throw new ArgumentNullException(nameof(IShardingConfigOption)); + shardingConfigOption = ShardingContainer.GetService>().FirstOrDefault(o => o.ShardingDbContextType == ShardingDbContextType && o.ActualDbContextType == typeof(T)) ?? throw new ArgumentNullException(nameof(IShardingConfigOption)); if (shardingConfigOption.UseReadWrite) { _readWriteOptions = ShardingContainer @@ -152,15 +152,15 @@ namespace ShardingCore.Sharding throw new ShardingCoreException("multi route not support track"); if (!(routeTail is ISingleQueryRouteTail singleQueryRouteTail)) throw new ShardingCoreException("multi route not support track"); - var cacheKey = routeTail.GetRouteTailIdenty(); + var cacheKey = routeTail.GetRouteTailIdentity(); if (!_dbContextCaches.TryGetValue(cacheKey, out var dbContext)) { dbContext = _shardingDbContextFactory.Create(ShardingDbContextType, GetShareShardingDbContextOptions(routeTail)); + if (IsBeginTransaction) + dbContext.Database.UseTransaction(Database.CurrentTransaction.GetDbTransaction()); + _dbContextCaches.TryAdd(cacheKey, dbContext); } - - if (IsBeginTransaction) - dbContext.Database.UseTransaction(Database.CurrentTransaction.GetDbTransaction()); return dbContext; } else @@ -187,7 +187,7 @@ namespace ShardingCore.Sharding { if (typeof(TEntity).IsShardingTable()) { - var physicTable = _virtualTableManager.GetVirtualTable(ShardingDbContextType, typeof(TEntity)).RouteTo(new TableRouteConfig(predicate:@where)); + var physicTable = _virtualTableManager.GetVirtualTable(ShardingDbContextType, typeof(TEntity)).RouteTo(new TableRouteConfig(predicate: @where)); if (physicTable.IsEmpty()) throw new ShardingCoreException($"{@where.ShardingPrint()} cant found ant physic table"); return physicTable.Select(o => GetDbContext(true, _routeTailFactory.Create(o.Tail))); @@ -472,7 +472,7 @@ namespace ShardingCore.Sharding int i = 0; if (!isBeginTransaction) { - using(var tran= Database.BeginTransaction()) + using (var tran = Database.BeginTransaction()) { foreach (var dbContextCache in _dbContextCaches) diff --git a/src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs b/src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs index 69575bba..e1ac8135 100644 --- a/src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs +++ b/src/ShardingCore/Sharding/ShardingQueryExecutors/EnumeratorShardingQueryExecutor.cs @@ -94,13 +94,13 @@ namespace ShardingCore.Sharding.ShardingQueryExecutors } } - if (paginationMetadata.EnableUnevenShardingPage) - { - if (paginationMetadata.IsUseUneven(_shardingPageManager.Current.RouteQueryResults, _streamMergeContext.Skip.GetValueOrDefault())) - { + //if (paginationMetadata.EnableUnevenShardingPage) + //{ + // if (paginationMetadata.IsUseUneven(_shardingPageManager.Current.RouteQueryResults, _streamMergeContext.Skip.GetValueOrDefault())) + // { - } - } + // } + //} } } } diff --git a/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute.cs b/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute.cs index fcc10218..e9b64b9a 100644 --- a/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute.cs +++ b/src/ShardingCore/VirtualRoutes/Days/AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute.cs @@ -1,18 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq.Expressions; using ShardingCore.Core; using ShardingCore.Core.VirtualRoutes; using ShardingCore.VirtualRoutes.Abstractions; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; namespace ShardingCore.VirtualRoutes.Days { -/* -* @Author: xjm -* @Description: -* @Date: Wednesday, 27 January 2021 08:41:05 -* @Email: 326308290@qq.com -*/ + /* + * @Author: xjm + * @Description: + * @Date: Wednesday, 27 January 2021 08:41:05 + * @Email: 326308290@qq.com + */ public abstract class AbstractSimpleShardingDayKeyDateTimeVirtualTableRoute:AbstractShardingTimeKeyDateTimeVirtualTableRoute where T:class,IShardingTable { public abstract DateTime GetBeginTime(); @@ -41,6 +41,7 @@ namespace ShardingCore.VirtualRoutes.Days protected override Expression> GetRouteToFilter(DateTime shardingKey, ShardingOperatorEnum shardingOperator) { + var t = TimeFormatToTail(shardingKey); switch (shardingOperator) { @@ -67,5 +68,6 @@ namespace ShardingCore.VirtualRoutes.Days } } } + } } \ No newline at end of file