@@ -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