This commit is contained in:
parent
9b788bd77b
commit
a939058cd1
|
@ -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();
|
||||
|
|
|
@ -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" });
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft": "Warning",
|
||||
"Default": "Debug",
|
||||
"Microsoft": "Debug",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue