Skip to content

Commit 9b788bd

Browse files
committed
修复method call expression 的bug
1 parent 38b53e8 commit 9b788bd

File tree

1 file changed

+39
-13
lines changed

1 file changed

+39
-13
lines changed

src/ShardingCore/Sharding/Visitors/DbContextReplaceQueryableVisitor.cs

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,18 @@ private MemberExpression ReplaceMemberExpression(IQueryable queryable)
8686
Expression.Property(ConstantExpression.Constant(tempVariable), nameof(TempVariable<object>.Queryable));
8787
return queryableMemberReplaceExpression;
8888
}
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+
}
89101

90102
private MemberExpression ReplaceMemberExpression(DbContext dbContext)
91103
{
@@ -108,26 +120,35 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
108120
#endif
109121
if (notRoot)
110122
{
111-
var entityType = node.Method.ReturnType.GenericTypeArguments[0];
112-
113-
var whereCallExpression = ReplaceMethodCallExpression(node, entityType);
114-
return whereCallExpression;
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+
}
115131
}
116132
}
117133

118134
return base.VisitMethodCall(node);
119135
}
120136

121-
private MethodCallExpression ReplaceMethodCallExpression(MethodCallExpression methodCallExpression,
122-
Type entityType)
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+
// }
148+
149+
public Expression<Func<T, bool>> WhereTrueExpression<T>()
123150
{
124-
MethodCallExpression whereCallExpression = Expression.Call(
125-
typeof(IShardingQueryableExtension),
126-
nameof(IShardingQueryableExtension.ReplaceDbContextQueryableWithType),
127-
new Type[] { entityType },
128-
methodCallExpression, Expression.Constant(_dbContext)
129-
);
130-
return whereCallExpression;
151+
return t => true;
131152
}
132153

133154

@@ -139,6 +160,11 @@ public TempVariable(IQueryable<T1> queryable)
139160
{
140161
Queryable = queryable;
141162
}
163+
164+
public IQueryable<T1> GetQueryable()
165+
{
166+
return Queryable;
167+
}
142168
}
143169

144170
internal sealed class TempDbVariable<T1>

0 commit comments

Comments
 (0)