@@ -116,12 +116,31 @@ public static IRelationalCommand CreateCommand<T>(this IQueryable<T> source, out
116116
117117 public static IRelationalCommand CreateCommand ( this IQueryable source , out RelationalQueryContext queryContext )
118118 {
119+ bool EFCore_2_1 = false ;
120+
119121 var compilerField = typeof ( EntityQueryProvider ) . GetField ( "_queryCompiler" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
120122 var compiler = compilerField . GetValue ( source . Provider ) ;
121123
122124 // REFLECTION: Query.Provider.NodeTypeProvider (Use property for nullable logic)
123- var nodeTypeProviderField = compiler . GetType ( ) . GetProperty ( "NodeTypeProvider" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
124- var nodeTypeProvider = nodeTypeProviderField . GetValue ( compiler ) ;
125+ var nodeTypeProviderProperty = compiler . GetType ( ) . GetProperty ( "NodeTypeProvider" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
126+
127+ object nodeTypeProvider ;
128+ object QueryModelGenerator = null ;
129+
130+ if ( nodeTypeProviderProperty == null )
131+ {
132+ EFCore_2_1 = true ;
133+
134+ var QueryModelGeneratorField = compiler . GetType ( ) . GetField ( "_queryModelGenerator" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
135+ QueryModelGenerator = QueryModelGeneratorField . GetValue ( compiler ) ;
136+
137+ var nodeTypeProviderField = QueryModelGenerator . GetType ( ) . GetField ( "_nodeTypeProvider" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
138+ nodeTypeProvider = nodeTypeProviderField . GetValue ( QueryModelGenerator ) ;
139+ }
140+ else
141+ {
142+ nodeTypeProvider = nodeTypeProviderProperty . GetValue ( compiler ) ;
143+ }
125144
126145 var queryContextFactoryField = compiler . GetType ( ) . GetField ( "_queryContextFactory" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
127146 var queryContextFactory = ( IQueryContextFactory ) queryContextFactoryField . GetValue ( compiler ) ;
@@ -137,7 +156,16 @@ public static IRelationalCommand CreateCommand(this IQueryable source, out Relat
137156
138157 // REFLECTION: Query.Provider._queryCompiler._evaluatableExpressionFilter
139158#if NETSTANDARD2_0
140- var evaluatableExpressionFilter = ( IEvaluatableExpressionFilter ) compiler . GetType ( ) . GetField ( "_evaluatableExpressionFilter" , BindingFlags . NonPublic | BindingFlags . Instance ) . GetValue ( queryCompiler ) ;
159+ IEvaluatableExpressionFilter evaluatableExpressionFilter = null ;
160+
161+ if ( EFCore_2_1 )
162+ {
163+ evaluatableExpressionFilter = ( IEvaluatableExpressionFilter ) QueryModelGenerator . GetType ( ) . GetField ( "_evaluatableExpressionFilter" , BindingFlags . NonPublic | BindingFlags . Instance ) . GetValue ( QueryModelGenerator ) ;
164+ }
165+ else
166+ {
167+ evaluatableExpressionFilter = ( IEvaluatableExpressionFilter ) compiler . GetType ( ) . GetField ( "_evaluatableExpressionFilter" , BindingFlags . NonPublic | BindingFlags . Instance ) . GetValue ( queryCompiler ) ;
168+ }
141169#else
142170 var evalutableExpressionFilterField = compiler . GetType ( ) . GetField ( "_evaluatableExpressionFilter" , BindingFlags . NonPublic | BindingFlags . Static ) ;
143171 var evalutableExpressionFilter = ( IEvaluatableExpressionFilter ) evalutableExpressionFilterField . GetValue ( null ) ;
@@ -167,12 +195,26 @@ public static IRelationalCommand CreateCommand(this IQueryable source, out Relat
167195 . GetProperty ( "Logger" , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) ;
168196 var logger = loggerField . GetValue ( dependencies2 ) ;
169197
170- var parameterExtractingExpressionVisitorConstructor = typeof ( ParameterExtractingExpressionVisitor ) . GetConstructors ( ) . First ( x => x . GetParameters ( ) . Length == 5 ) ;
171-
172- var parameterExtractingExpressionVisitor = ( ParameterExtractingExpressionVisitor ) parameterExtractingExpressionVisitorConstructor . Invoke ( new object [ ] { evaluatableExpressionFilter , queryContext , logger , true , false } ) ;
173-
174- // CREATE new query from query visitor
175- newQuery = parameterExtractingExpressionVisitor . ExtractParameters ( source . Expression ) ;
198+ var parameterExtractingExpressionVisitorConstructors = typeof ( ParameterExtractingExpressionVisitor ) . GetConstructors ( ) ;
199+
200+ if ( parameterExtractingExpressionVisitorConstructors . Any ( x => x . GetParameters ( ) . Length == 5 ) )
201+ {
202+ // EF Core 2.1
203+ var parameterExtractingExpressionVisitorConstructor = parameterExtractingExpressionVisitorConstructors . First ( x => x . GetParameters ( ) . Length == 5 ) ;
204+ var parameterExtractingExpressionVisitor = ( ParameterExtractingExpressionVisitor ) parameterExtractingExpressionVisitorConstructor . Invoke ( new object [ ] { evaluatableExpressionFilter , queryContext , logger , true , false } ) ;
205+
206+ // CREATE new query from query visitor
207+ newQuery = parameterExtractingExpressionVisitor . ExtractParameters ( source . Expression ) ;
208+ }
209+ else
210+ {
211+ // EF Core 2.1 Preview 2. We pass null for the DbContext, may require something else!
212+ var parameterExtractingExpressionVisitorConstructor = parameterExtractingExpressionVisitorConstructors . First ( x => x . GetParameters ( ) . Length == 6 ) ;
213+ var parameterExtractingExpressionVisitor = ( ParameterExtractingExpressionVisitor ) parameterExtractingExpressionVisitorConstructor . Invoke ( new object [ ] { evaluatableExpressionFilter , queryContext , logger , null , true , false } ) ;
214+
215+ // CREATE new query from query visitor
216+ newQuery = parameterExtractingExpressionVisitor . ExtractParameters ( source . Expression ) ;
217+ }
176218 }
177219 else
178220 {
@@ -193,9 +235,18 @@ public static IRelationalCommand CreateCommand(this IQueryable source, out Relat
193235 //var query = new QueryAnnotatingExpressionVisitor().Visit(source.Expression);
194236 //var newQuery = ParameterExtractingExpressionVisitor.ExtractParameters(query, queryContext, evalutableExpressionFilter);
195237
196- #if NETSTANDARD2_0
197- var queryParserMethod = compiler . GetType ( ) . GetMethod ( "CreateQueryParser" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
198- var queryparser = ( QueryParser ) queryParserMethod . Invoke ( compiler , new [ ] { nodeTypeProvider } ) ;
238+ #if NETSTANDARD2_0
239+ QueryParser queryparser = null ;
240+ if ( EFCore_2_1 )
241+ {
242+ var queryParserMethod = QueryModelGenerator . GetType ( ) . GetMethod ( "CreateQueryParser" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
243+ queryparser = ( QueryParser ) queryParserMethod . Invoke ( QueryModelGenerator , new [ ] { nodeTypeProvider } ) ;
244+ }
245+ else
246+ {
247+ var queryParserMethod = compiler . GetType ( ) . GetMethod ( "CreateQueryParser" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
248+ queryparser = ( QueryParser ) queryParserMethod . Invoke ( compiler , new [ ] { nodeTypeProvider } ) ;
249+ }
199250#else
200251 var queryParserMethod = compiler . GetType ( ) . GetMethod ( "CreateQueryParser" , BindingFlags . NonPublic | BindingFlags . Static ) ;
201252 var queryparser = ( QueryParser ) queryParserMethod . Invoke ( null , new [ ] { nodeTypeProvider } ) ;
0 commit comments