diff --git a/nuget-publish.bat b/nuget-publish.bat index 0b4841c2..19e0d287 100644 --- a/nuget-publish.bat +++ b/nuget-publish.bat @@ -1,9 +1,9 @@ :start ::定义版本 -set EFCORE2=2.5.0.3 -set EFCORE3=3.5.0.3 -set EFCORE5=5.5.0.3 -set EFCORE6=6.5.0.3 +set EFCORE2=2.5.0.4 +set EFCORE3=3.5.0.4 +set EFCORE5=5.5.0.4 +set EFCORE6=6.5.0.4 ::删除所有bin与obj下的文件 @echo off diff --git a/samples/Sample.SqlServer/Controllers/ValuesController.cs b/samples/Sample.SqlServer/Controllers/ValuesController.cs index ac131a90..c04e8a2f 100644 --- a/samples/Sample.SqlServer/Controllers/ValuesController.cs +++ b/samples/Sample.SqlServer/Controllers/ValuesController.cs @@ -393,6 +393,7 @@ namespace Sample.SqlServer.Controllers public async Task Get7() { + var resultx112331tt2 = await _defaultTableDbContext.Set().Where(o => o.Id == "2") .Select(o => new { diff --git a/src/ShardingCore/Extensions/CommonExtension.cs b/src/ShardingCore/Extensions/CommonExtension.cs index dd9af383..1da2795a 100644 --- a/src/ShardingCore/Extensions/CommonExtension.cs +++ b/src/ShardingCore/Extensions/CommonExtension.cs @@ -165,7 +165,7 @@ namespace ShardingCore.Extensions { if (memberExpression == null) throw new ArgumentNullException(nameof(memberExpression)); - return memberExpression.Type.FullName?.StartsWith("System.Linq.IQueryable`1") ?? false; + return (memberExpression.Type.FullName?.StartsWith("System.Linq.IQueryable`1") ?? false) || typeof(DbContext).IsAssignableFrom(memberExpression.Type); } public static Type GetSequenceType(this Type type) diff --git a/src/ShardingCore/Sharding/Visitors/DbContextReplaceQueryableVisitor.cs b/src/ShardingCore/Sharding/Visitors/DbContextReplaceQueryableVisitor.cs index 6348f2db..1da5a944 100644 --- a/src/ShardingCore/Sharding/Visitors/DbContextReplaceQueryableVisitor.cs +++ b/src/ShardingCore/Sharding/Visitors/DbContextReplaceQueryableVisitor.cs @@ -48,6 +48,11 @@ namespace ShardingCore.Core.Internal.Visitors { return ReplaceMemberExpression(queryable); } + + if (value is DbContext dbContext) + { + return ReplaceMemberExpression(dbContext); + } //return Expression.Constant(value); } @@ -58,6 +63,10 @@ namespace ShardingCore.Core.Internal.Visitors { return ReplaceMemberExpression(queryable); } + if (value is DbContext dbContext) + { + return ReplaceMemberExpression(dbContext); + } } } } @@ -76,6 +85,14 @@ namespace ShardingCore.Core.Internal.Visitors Expression.Property(ConstantExpression.Constant(tempVariable), nameof(TempVariable.Queryable)); return queryableMemberReplaceExpression; } + private MemberExpression ReplaceMemberExpression(DbContext dbContext) + { + var tempVariableGenericType = typeof(TempDbVariable<>).GetGenericType0(dbContext.GetType()); + var tempVariable = Activator.CreateInstance(tempVariableGenericType, _dbContext); + MemberExpression queryableMemberReplaceExpression = + Expression.Property(ConstantExpression.Constant(tempVariable), nameof(TempDbVariable.DbContext)); + return queryableMemberReplaceExpression; + } internal sealed class TempVariable { @@ -86,6 +103,15 @@ namespace ShardingCore.Core.Internal.Visitors Queryable = queryable; } } + internal sealed class TempDbVariable + { + public T1 DbContext { get; } + + public TempDbVariable(T1 dbContext) + { + DbContext = dbContext; + } + } }