3636using Remotion . Linq . Parsing . Structure ;
3737using Microsoft . EntityFrameworkCore . Query . Expressions ;
3838using Remotion . Linq . Clauses ;
39+ using Microsoft . EntityFrameworkCore . Query . Sql ;
3940
4041#endif
4142
@@ -90,6 +91,9 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
9091 {
9192 bool isEFCore2x = false ;
9293 bool EFCore_2_1 = false ;
94+ #if EFCORE
95+ bool isEFCore3x = EFCoreHelper . IsVersion3x ;
96+ #endif
9397
9498 var context = Query . GetDbContext ( ) ;
9599
@@ -155,7 +159,11 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
155159#if NETSTANDARD2_0
156160 IEvaluatableExpressionFilter evaluatableExpressionFilter = null ;
157161
158- if ( EFCore_2_1 )
162+ if ( isEFCore3x )
163+ {
164+ evaluatableExpressionFilter = ( RelationalEvaluatableExpressionFilter ) QueryModelGenerator . GetType ( ) . GetProperty ( "EvaluatableExpressionFilter" , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance ) . GetValue ( QueryModelGenerator ) ;
165+ }
166+ else if ( EFCore_2_1 )
159167 {
160168 evaluatableExpressionFilter = ( IEvaluatableExpressionFilter ) QueryModelGenerator . GetType ( ) . GetField ( "_evaluatableExpressionFilter" , BindingFlags . NonPublic | BindingFlags . Instance ) . GetValue ( QueryModelGenerator ) ;
161169 }
@@ -226,7 +234,15 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
226234 var innerConnectionField = typeof ( RelationalConnection ) . GetField ( "_connection" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
227235 var initalConnection = innerConnectionField . GetValue ( QueryConnection ) ;
228236
229- innerConnectionField . SetValue ( QueryConnection , new Microsoft . EntityFrameworkCore . Internal . LazyRef < DbConnection > ( ( ) => innerConnection ) ) ;
237+ if ( EFCoreHelper . IsVersion3xPreview5 )
238+ {
239+ innerConnectionField . SetValue ( QueryConnection , innerConnection ) ;
240+ }
241+ else
242+ {
243+ innerConnectionField . SetValue ( QueryConnection , LazyHelper . NewLazy < DbConnection > ( ( ) => innerConnection ) ) ;
244+ }
245+
230246
231247 RestoreConnection = ( ) => innerConnectionField . SetValue ( QueryConnection , initalConnection ) ;
232248 }
@@ -244,7 +260,7 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
244260 var executionStrategyFactoryField = queryContextFactory . GetType ( ) . GetProperty ( "ExecutionStrategyFactory" , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance | BindingFlags . FlattenHierarchy ) ;
245261 var executionStrategyFactory = executionStrategyFactoryField . GetValue ( queryContextFactory ) ;
246262
247- var lazyRefStateManager = new LazyRef < IStateManager > ( ( ) => stateManager ) ;
263+ var lazyRefStateManager = LazyHelper . NewLazy ( ( ) => stateManager ) ;
248264
249265 queryContext = ( RelationalQueryContext ) relationalQueryContextConstructor . Invoke ( new object [ ] { createQueryBufferDelegate , QueryConnection , lazyRefStateManager , concurrencyDetector , executionStrategyFactory } ) ;
250266 }
@@ -254,7 +270,7 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
254270 var executionStrategyFactoryField = queryContextFactory . GetType ( ) . GetProperty ( "ExecutionStrategyFactory" , BindingFlags . Public | BindingFlags . NonPublic | BindingFlags . Instance | BindingFlags . FlattenHierarchy ) ;
255271 var executionStrategyFactory = executionStrategyFactoryField . GetValue ( queryContextFactory ) ;
256272
257- var lazyRefStateManager = new LazyRef < IStateManager > ( ( ) => stateManager ) ;
273+ var lazyRefStateManager = LazyHelper . NewLazy ( ( ) => stateManager ) ;
258274
259275 var dependenciesProperty3 = typeof ( RelationalQueryContextFactory ) . GetProperty ( "Dependencies" , BindingFlags . NonPublic | BindingFlags . Instance ) ;
260276 var dependencies3 = dependenciesProperty3 . GetValue ( queryContextFactory ) ;
@@ -270,8 +286,16 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
270286
271287 Expression newQuery ;
272288
289+ if ( isEFCore3x )
290+ {
291+ var parameterExtractingExpressionVisitorConstructor = typeof ( ParameterExtractingExpressionVisitor ) . GetConstructors ( ) . First ( x => x . GetParameters ( ) . Length == 6 ) ;
273292
274- if ( isEFCore2x )
293+ var parameterExtractingExpressionVisitor = ( ParameterExtractingExpressionVisitor ) parameterExtractingExpressionVisitorConstructor . Invoke ( new object [ ] { evaluatableExpressionFilter , queryContext , queryContext . GetType ( ) , logger , true , false } ) ;
294+
295+ // CREATE new query from query visitor
296+ newQuery = parameterExtractingExpressionVisitor . ExtractParameters ( Query . Expression ) ;
297+ }
298+ else if ( isEFCore2x )
275299 {
276300 var parameterExtractingExpressionVisitorConstructors = typeof ( ParameterExtractingExpressionVisitor ) . GetConstructors ( ) ;
277301
@@ -289,10 +313,9 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
289313
290314 var parameterExtractingExpressionVisitorConstructor = parameterExtractingExpressionVisitorConstructors . First ( x => x . GetParameters ( ) . Length == 6 ) ;
291315
292- ParameterExtractingExpressionVisitor parameterExtractingExpressionVisitor = null ;
316+ ParameterExtractingExpressionVisitor parameterExtractingExpressionVisitor = null ;
293317
294- // EF Core 2.1
295- if ( parameterExtractingExpressionVisitorConstructor . GetParameters ( ) . Where ( x => x . ParameterType == typeof ( DbContext ) ) . Any ( ) )
318+ if ( parameterExtractingExpressionVisitorConstructor . GetParameters ( ) . Where ( x => x . ParameterType == typeof ( DbContext ) ) . Any ( ) )
296319 {
297320 parameterExtractingExpressionVisitor = ( ParameterExtractingExpressionVisitor ) parameterExtractingExpressionVisitorConstructor . Invoke ( new object [ ] { evaluatableExpressionFilter , queryContext , logger , context , true , false } ) ;
298321 }
@@ -346,14 +369,33 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
346369 sqlQuery = queryModelVisitor . Queries . First ( ) ;
347370 }
348371
349- // RETURN the IRealationCommand
372+ // RETURN the IRelationalCommand
373+ #if EFCORE
374+ IRelationalCommand relationalCommand = null ;
375+ var dynamicSqlGenerator = ( dynamic ) sqlQuery . CreateDefaultQuerySqlGenerator ( ) ;
376+
377+ if ( isEFCore3x )
378+ {
379+ var commandBuilderFactory = context . Database . GetService < IRelationalCommandBuilderFactory > ( ) ;
380+
381+ // TODO: Fix null for DbLogger
382+ relationalCommand = ( IRelationalCommand ) dynamicSqlGenerator . GenerateSql ( commandBuilderFactory , queryContext . ParameterValues , null ) ;
383+ }
384+ else
385+ {
386+ relationalCommand = ( IRelationalCommand ) dynamicSqlGenerator . GenerateSql ( queryContext . ParameterValues ) ;
387+ }
388+
389+ #else
350390 var relationalCommand = sqlQuery . CreateDefaultQuerySqlGenerator ( ) . GenerateSql ( queryContext . ParameterValues ) ;
391+ #endif
392+
351393 return relationalCommand ;
352394 }
353395#endif
354396
355- /// <summary>Sets the result of the query deferred.</summary>
356- /// <param name="reader">The reader returned from the query execution.</param>
397+ /// <summary>Sets the result of the query deferred.</summary>
398+ /// <param name="reader">The reader returned from the query execution.</param>
357399 public virtual void SetResult ( DbDataReader reader )
358400 {
359401 }
0 commit comments