Skip to content

Commit a939058

Browse files
committed
1
1 parent 9b788bd commit a939058

File tree

6 files changed

+55
-52
lines changed

6 files changed

+55
-52
lines changed

samples/Sample.MySql/Controllers/WeatherForecastController.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,20 @@ public WeatherForecastController(DefaultShardingDbContext defaultTableDbContext,
3535
_otherDbContext = otherDbContext;
3636
}
3737

38-
public IQueryable<SysUserMod> GetAll()
38+
public IQueryable<SysTest> GetAll()
3939
{
4040

41-
return _defaultTableDbContext.Set<SysUserMod>();
41+
return _defaultTableDbContext.Set<SysTest>();
4242
}
4343
[HttpGet]
4444
public async Task<IActionResult> Get()
4545
{
46-
OtherDbContext.CurrentId = "";
47-
var myUsers0 = _otherDbContext.MyUsers.ToList();
48-
OtherDbContext.CurrentId = "123";
49-
var myUsers1 = _otherDbContext.MyUsers.ToList();
50-
OtherDbContext.CurrentId = "456";
51-
var myUsers2= _otherDbContext.MyUsers.ToList();
46+
OtherDbContext.CurrentId = "";
47+
// var myUsers0 = _otherDbContext.MyUsers.ToList();
48+
// OtherDbContext.CurrentId = "123";
49+
// var myUsers1 = _otherDbContext.MyUsers.ToList();
50+
// OtherDbContext.CurrentId = "456";
51+
// var myUsers2= _otherDbContext.MyUsers.ToList();
5252

5353
// var sysUserModQueryable = _otherDbContext.MyUsers.Where(o => o.Id == "2");
5454
// var dbSetDiscoverExpressionVisitor = new DbSetDiscoverExpressionVisitor<MyUser>(_otherDbContext);
@@ -59,7 +59,7 @@ public async Task<IActionResult> Get()
5959
// {
6060
var sysUserMods = _defaultTableDbContext.Set<SysUserMod>().OrderBy(o=>o.Id).ThenBy(o=>o.Name);
6161

62-
var sysUserMods1 = _defaultTableDbContext.Set<SysUserMod>()
62+
var sysUserMods1 = _defaultTableDbContext.Set<SysTest>()
6363
.Select(o => new ssss(){ Id = o.Id, C = GetAll().Count(x => x.Id == o.Id) }).ToList();
6464
var resultX = await _defaultTableDbContext.Set<SysUserMod>()
6565
.Where(o => o.Id == "2" || o.Id == "3").FirstOrDefaultAsync();

samples/Sample.MySql/DbContexts/DefaultShardingDbContext.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
2828
modelBuilder.ApplyConfiguration(new SysUserModMap());
2929
modelBuilder.ApplyConfiguration(new SysTestMap());
3030
modelBuilder.ApplyConfiguration(new SysUserLogByMonthMap());
31-
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
32-
{
33-
_configureGlobalFiltersMethodInfo?.MakeGenericMethod(entityType.ClrType)
34-
.Invoke(this, new object[] { modelBuilder, entityType });
35-
}
31+
// foreach (var entityType in modelBuilder.Model.GetEntityTypes())
32+
// {
33+
// _configureGlobalFiltersMethodInfo?.MakeGenericMethod(entityType.ClrType)
34+
// .Invoke(this, new object[] { modelBuilder, entityType });
35+
// }
3636

3737
modelBuilder.Entity<SysUserLogByMonth>().HasData(new SysUserLogByMonth() { Id = "1", Time = DateTime.Now });
3838
modelBuilder.Entity<SysTest>().HasData(new SysTest() { Id = "1", UserId = "123" });

samples/Sample.MySql/Sample.MySql.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.8">
10+
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.0">
1111
<PrivateAssets>all</PrivateAssets>
1212
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1313
</PackageReference>
14-
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.2" />
14+
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="5.0.0" />
1515
</ItemGroup>
1616

1717
<ItemGroup>
18-
<ProjectReference Include="..\..\src\ShardingCore\ShardingCore.csproj" />
18+
<ProjectReference Include="..\..\src5x\ShardingCore.5x\ShardingCore.5x.csproj" />
1919
</ItemGroup>
2020

2121

22+
2223
</Project>

samples/Sample.MySql/appsettings.Development.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"Logging": {
33
"LogLevel": {
4-
"Default": "Information",
5-
"Microsoft": "Warning",
4+
"Default": "Debug",
5+
"Microsoft": "Debug",
66
"Microsoft.Hosting.Lifetime": "Information"
77
}
88
}

src/ShardingCore/Extensions/IShardingQueryableExtension.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ internal static IQueryable<TSource> ReplaceDbContextQueryableWithType<TSource>(t
134134
internal static Expression ReplaceDbContextExpression(this Expression queryExpression, DbContext dbContext)
135135
{
136136
DbContextReplaceQueryableVisitor replaceQueryableVisitor = new DbContextReplaceQueryableVisitor(dbContext);
137-
return replaceQueryableVisitor.Visit(queryExpression);
137+
var expression = replaceQueryableVisitor.Visit(queryExpression);
138+
return expression;
138139
}
139140
}
140141
}

src/ShardingCore/Sharding/Visitors/DbContextReplaceQueryableVisitor.cs

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace ShardingCore.Core.Internal.Visitors
2121
internal class DbContextInnerMemberReferenceReplaceQueryableVisitor : ExpressionVisitor
2222
{
2323
private readonly DbContext _dbContext;
24+
protected bool RootIsVisit = false;
2425

2526
public DbContextInnerMemberReferenceReplaceQueryableVisitor(DbContext dbContext)
2627
{
@@ -86,18 +87,6 @@ private MemberExpression ReplaceMemberExpression(IQueryable queryable)
8687
Expression.Property(ConstantExpression.Constant(tempVariable), nameof(TempVariable<object>.Queryable));
8788
return queryableMemberReplaceExpression;
8889
}
89-
private MethodCallExpression ReplaceMethodCallExpression(IQueryable queryable)
90-
{
91-
var dbContextReplaceQueryableVisitor = new DbContextReplaceQueryableVisitor(_dbContext);
92-
var newExpression = dbContextReplaceQueryableVisitor.Visit(queryable.Expression);
93-
var newQueryable = dbContextReplaceQueryableVisitor.Source.Provider.CreateQuery(newExpression);
94-
var tempVariableGenericType = typeof(TempVariable<>).GetGenericType0(queryable.ElementType);
95-
var tempVariable = Activator.CreateInstance(tempVariableGenericType, newQueryable);
96-
// MemberExpression queryableMemberReplaceExpression =
97-
// Expression.Property(, nameof(TempVariable<object>.Queryable));
98-
99-
return Expression.Call(ConstantExpression.Constant(tempVariable),tempVariableGenericType.GetMethod(nameof(TempVariable<object>.GetQueryable)),new Expression[0]);
100-
}
10190

10291
private MemberExpression ReplaceMemberExpression(DbContext dbContext)
10392
{
@@ -110,7 +99,7 @@ private MemberExpression ReplaceMemberExpression(DbContext dbContext)
11099
}
111100
protected override Expression VisitMethodCall(MethodCallExpression node)
112101
{
113-
if (node.Method.ReturnType.IsMethodReturnTypeQueryableType()&&node.Method.ReturnType.IsGenericType)
102+
if (RootIsVisit&&node.Method.ReturnType.IsMethodReturnTypeQueryableType()&&node.Method.ReturnType.IsGenericType)
114103
{
115104
#if EFCORE2 || EFCORE3
116105
var notRoot = node.Arguments.All(o => !(o is ConstantExpression constantExpression&&constantExpression.Value is IQueryable));
@@ -120,31 +109,27 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
120109
#endif
121110
if (notRoot)
122111
{
123-
var objQueryable = Expression.Lambda(node).Compile().DynamicInvoke();
124-
if (objQueryable != null && objQueryable is IQueryable queryable)
125-
{
126-
return ReplaceMethodCallExpression(queryable);
127-
// var whereCallExpression = ReplaceMethodCallExpression(replaceMemberExpression);
128-
// return base.VisitMethodCall(whereCallExpression);;
129-
// Console.WriteLine("1");
130-
}
112+
var entityType = node.Method.ReturnType.GenericTypeArguments[0];
113+
114+
var whereCallExpression = ReplaceMethodCallExpression(node, entityType);
115+
return whereCallExpression;
131116
}
132117
}
133118

134119
return base.VisitMethodCall(node);
135120
}
136121

137-
// private MethodCallExpression ReplaceMethodCallExpression(MemberExpression memberExpression)
138-
// {
139-
// var lambdaExpression = GetType().GetMethod(nameof(WhereTrueExpression)).MakeGenericMethod(new Type[] { queryable.ElementType }).Invoke(this,new object[]{});
140-
// MethodCallExpression whereCallExpression = Expression.Call(
141-
// typeof(Queryable),
142-
// nameof(Queryable.Where),
143-
// new Type[] { queryable.ElementType },
144-
// queryable.Expression, (LambdaExpression)lambdaExpression
145-
// );
146-
// return whereCallExpression;
147-
// }
122+
private MethodCallExpression ReplaceMethodCallExpression(MethodCallExpression methodCallExpression,
123+
Type entityType)
124+
{
125+
MethodCallExpression whereCallExpression = Expression.Call(
126+
typeof(IShardingQueryableExtension),
127+
nameof(IShardingQueryableExtension.ReplaceDbContextQueryableWithType),
128+
new Type[] { entityType },
129+
methodCallExpression, Expression.Constant(_dbContext)
130+
);
131+
return whereCallExpression;
132+
}
148133

149134
public Expression<Func<T, bool>> WhereTrueExpression<T>()
150135
{
@@ -166,6 +151,20 @@ public IQueryable<T1> GetQueryable()
166151
return Queryable;
167152
}
168153
}
154+
internal sealed class TempMethodVariable<T1>
155+
{
156+
public IQueryable<T1> Queryable { get; }
157+
158+
public TempMethodVariable(Func<IQueryable<T1>> func)
159+
{
160+
Queryable = func();
161+
}
162+
163+
public IQueryable<T1> GetQueryable()
164+
{
165+
return Queryable;
166+
}
167+
}
169168

170169
internal sealed class TempDbVariable<T1>
171170
{
@@ -207,6 +206,7 @@ protected override Expression VisitConstant(ConstantExpression node)
207206
if (Source == null)
208207
Source = newQueryable;
209208
// return base.Visit(Expression.Constant(newQueryable));
209+
RootIsVisit = true;
210210
return Expression.Constant(newQueryable);
211211
}
212212

@@ -245,6 +245,7 @@ protected override Expression VisitExtension(Expression node)
245245
//如何替换ef5的set
246246
var replaceQueryRoot = new ReplaceSingleQueryRootExpressionVisitor();
247247
replaceQueryRoot.Visit(newQueryable.Expression);
248+
RootIsVisit = true;
248249
return base.VisitExtension(replaceQueryRoot.QueryRootExpression);
249250
}
250251

0 commit comments

Comments
 (0)