This commit is contained in:
xuejiaming 2022-09-14 16:17:46 +08:00
parent 9b788bd77b
commit a939058cd1
6 changed files with 55 additions and 52 deletions

View File

@ -35,20 +35,20 @@ namespace Sample.MySql.Controllers
_otherDbContext = otherDbContext;
}
public IQueryable<SysUserMod> GetAll()
public IQueryable<SysTest> GetAll()
{
return _defaultTableDbContext.Set<SysUserMod>();
return _defaultTableDbContext.Set<SysTest>();
}
[HttpGet]
public async Task<IActionResult> Get()
{
OtherDbContext.CurrentId = "";
var myUsers0 = _otherDbContext.MyUsers.ToList();
OtherDbContext.CurrentId = "123";
var myUsers1 = _otherDbContext.MyUsers.ToList();
OtherDbContext.CurrentId = "456";
var myUsers2= _otherDbContext.MyUsers.ToList();
OtherDbContext.CurrentId = "";
// var myUsers0 = _otherDbContext.MyUsers.ToList();
// OtherDbContext.CurrentId = "123";
// var myUsers1 = _otherDbContext.MyUsers.ToList();
// OtherDbContext.CurrentId = "456";
// var myUsers2= _otherDbContext.MyUsers.ToList();
// var sysUserModQueryable = _otherDbContext.MyUsers.Where(o => o.Id == "2");
// var dbSetDiscoverExpressionVisitor = new DbSetDiscoverExpressionVisitor<MyUser>(_otherDbContext);
@ -59,7 +59,7 @@ namespace Sample.MySql.Controllers
// {
var sysUserMods = _defaultTableDbContext.Set<SysUserMod>().OrderBy(o=>o.Id).ThenBy(o=>o.Name);
var sysUserMods1 = _defaultTableDbContext.Set<SysUserMod>()
var sysUserMods1 = _defaultTableDbContext.Set<SysTest>()
.Select(o => new ssss(){ Id = o.Id, C = GetAll().Count(x => x.Id == o.Id) }).ToList();
var resultX = await _defaultTableDbContext.Set<SysUserMod>()
.Where(o => o.Id == "2" || o.Id == "3").FirstOrDefaultAsync();

View File

@ -28,11 +28,11 @@ namespace Sample.MySql.DbContexts
modelBuilder.ApplyConfiguration(new SysUserModMap());
modelBuilder.ApplyConfiguration(new SysTestMap());
modelBuilder.ApplyConfiguration(new SysUserLogByMonthMap());
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
_configureGlobalFiltersMethodInfo?.MakeGenericMethod(entityType.ClrType)
.Invoke(this, new object[] { modelBuilder, entityType });
}
// foreach (var entityType in modelBuilder.Model.GetEntityTypes())
// {
// _configureGlobalFiltersMethodInfo?.MakeGenericMethod(entityType.ClrType)
// .Invoke(this, new object[] { modelBuilder, entityType });
// }
modelBuilder.Entity<SysUserLogByMonth>().HasData(new SysUserLogByMonth() { Id = "1", Time = DateTime.Now });
modelBuilder.Entity<SysTest>().HasData(new SysTest() { Id = "1", UserId = "123" });

View File

@ -7,16 +7,17 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.8">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.2" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\ShardingCore\ShardingCore.csproj" />
<ProjectReference Include="..\..\src5x\ShardingCore.5x\ShardingCore.5x.csproj" />
</ItemGroup>
</Project>

View File

@ -1,8 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Default": "Debug",
"Microsoft": "Debug",
"Microsoft.Hosting.Lifetime": "Information"
}
}

View File

@ -134,7 +134,8 @@ namespace ShardingCore.Extensions
internal static Expression ReplaceDbContextExpression(this Expression queryExpression, DbContext dbContext)
{
DbContextReplaceQueryableVisitor replaceQueryableVisitor = new DbContextReplaceQueryableVisitor(dbContext);
return replaceQueryableVisitor.Visit(queryExpression);
var expression = replaceQueryableVisitor.Visit(queryExpression);
return expression;
}
}
}

View File

@ -21,6 +21,7 @@ namespace ShardingCore.Core.Internal.Visitors
internal class DbContextInnerMemberReferenceReplaceQueryableVisitor : ExpressionVisitor
{
private readonly DbContext _dbContext;
protected bool RootIsVisit = false;
public DbContextInnerMemberReferenceReplaceQueryableVisitor(DbContext dbContext)
{
@ -86,18 +87,6 @@ namespace ShardingCore.Core.Internal.Visitors
Expression.Property(ConstantExpression.Constant(tempVariable), nameof(TempVariable<object>.Queryable));
return queryableMemberReplaceExpression;
}
private MethodCallExpression ReplaceMethodCallExpression(IQueryable queryable)
{
var dbContextReplaceQueryableVisitor = new DbContextReplaceQueryableVisitor(_dbContext);
var newExpression = dbContextReplaceQueryableVisitor.Visit(queryable.Expression);
var newQueryable = dbContextReplaceQueryableVisitor.Source.Provider.CreateQuery(newExpression);
var tempVariableGenericType = typeof(TempVariable<>).GetGenericType0(queryable.ElementType);
var tempVariable = Activator.CreateInstance(tempVariableGenericType, newQueryable);
// MemberExpression queryableMemberReplaceExpression =
// Expression.Property(, nameof(TempVariable<object>.Queryable));
return Expression.Call(ConstantExpression.Constant(tempVariable),tempVariableGenericType.GetMethod(nameof(TempVariable<object>.GetQueryable)),new Expression[0]);
}
private MemberExpression ReplaceMemberExpression(DbContext dbContext)
{
@ -110,7 +99,7 @@ namespace ShardingCore.Core.Internal.Visitors
}
protected override Expression VisitMethodCall(MethodCallExpression node)
{
if (node.Method.ReturnType.IsMethodReturnTypeQueryableType()&&node.Method.ReturnType.IsGenericType)
if (RootIsVisit&&node.Method.ReturnType.IsMethodReturnTypeQueryableType()&&node.Method.ReturnType.IsGenericType)
{
#if EFCORE2 || EFCORE3
var notRoot = node.Arguments.All(o => !(o is ConstantExpression constantExpression&&constantExpression.Value is IQueryable));
@ -120,31 +109,27 @@ namespace ShardingCore.Core.Internal.Visitors
#endif
if (notRoot)
{
var objQueryable = Expression.Lambda(node).Compile().DynamicInvoke();
if (objQueryable != null && objQueryable is IQueryable queryable)
{
return ReplaceMethodCallExpression(queryable);
// var whereCallExpression = ReplaceMethodCallExpression(replaceMemberExpression);
// return base.VisitMethodCall(whereCallExpression);;
// Console.WriteLine("1");
}
var entityType = node.Method.ReturnType.GenericTypeArguments[0];
var whereCallExpression = ReplaceMethodCallExpression(node, entityType);
return whereCallExpression;
}
}
return base.VisitMethodCall(node);
}
// private MethodCallExpression ReplaceMethodCallExpression(MemberExpression memberExpression)
// {
// var lambdaExpression = GetType().GetMethod(nameof(WhereTrueExpression)).MakeGenericMethod(new Type[] { queryable.ElementType }).Invoke(this,new object[]{});
// MethodCallExpression whereCallExpression = Expression.Call(
// typeof(Queryable),
// nameof(Queryable.Where),
// new Type[] { queryable.ElementType },
// queryable.Expression, (LambdaExpression)lambdaExpression
// );
// return whereCallExpression;
// }
private MethodCallExpression ReplaceMethodCallExpression(MethodCallExpression methodCallExpression,
Type entityType)
{
MethodCallExpression whereCallExpression = Expression.Call(
typeof(IShardingQueryableExtension),
nameof(IShardingQueryableExtension.ReplaceDbContextQueryableWithType),
new Type[] { entityType },
methodCallExpression, Expression.Constant(_dbContext)
);
return whereCallExpression;
}
public Expression<Func<T, bool>> WhereTrueExpression<T>()
{
@ -166,6 +151,20 @@ namespace ShardingCore.Core.Internal.Visitors
return Queryable;
}
}
internal sealed class TempMethodVariable<T1>
{
public IQueryable<T1> Queryable { get; }
public TempMethodVariable(Func<IQueryable<T1>> func)
{
Queryable = func();
}
public IQueryable<T1> GetQueryable()
{
return Queryable;
}
}
internal sealed class TempDbVariable<T1>
{
@ -207,6 +206,7 @@ namespace ShardingCore.Core.Internal.Visitors
if (Source == null)
Source = newQueryable;
// return base.Visit(Expression.Constant(newQueryable));
RootIsVisit = true;
return Expression.Constant(newQueryable);
}
@ -245,6 +245,7 @@ namespace ShardingCore.Core.Internal.Visitors
//如何替换ef5的set
var replaceQueryRoot = new ReplaceSingleQueryRootExpressionVisitor();
replaceQueryRoot.Visit(newQueryable.Expression);
RootIsVisit = true;
return base.VisitExtension(replaceQueryRoot.QueryRootExpression);
}