protected override Expression VisitShapedQueryExpression(ShapedQueryExpression shapedQueryExpression) { Check.NotNull(shapedQueryExpression, nameof(shapedQueryExpression)); var selectExpression = (SelectExpression)shapedQueryExpression.QueryExpression; selectExpression.ApplyTags(_tags); var dataReaderParameter = Expression.Parameter(typeof(DbDataReader), "dataReader"); var resultCoordinatorParameter = Expression.Parameter(typeof(ResultCoordinator), "resultCoordinator"); var indexMapParameter = Expression.Parameter(typeof(int[]), "indexMap"); var shaper = new ShaperExpressionProcessingExpressionVisitor( selectExpression, dataReaderParameter, resultCoordinatorParameter, indexMapParameter) .Inject(shapedQueryExpression.ShaperExpression); shaper = InjectEntityMaterializers(shaper); var isNonComposedFromSql = selectExpression.IsNonComposedFromSql(); shaper = new RelationalProjectionBindingRemovingExpressionVisitor( selectExpression, dataReaderParameter, isNonComposedFromSql ? indexMapParameter : null, IsBuffering) .Visit(shaper, out var projectionColumns); shaper = new CustomShaperCompilingExpressionVisitor(dataReaderParameter, resultCoordinatorParameter, IsTracking) .Visit(shaper); IReadOnlyList <string> columnNames = null; if (isNonComposedFromSql) { columnNames = selectExpression.Projection.Select(pe => ((ColumnExpression)pe.Expression).Name).ToList(); } var relationalCommandCache = new RelationalCommandCache( Dependencies.MemoryCache, RelationalDependencies.SqlExpressionFactory, RelationalDependencies.QuerySqlGeneratorFactory, RelationalDependencies.RelationalParameterBasedQueryTranslationPostprocessorFactory, _useRelationalNulls, selectExpression); var shaperLambda = (LambdaExpression)shaper; return(Expression.New( typeof(QueryingEnumerable <>).MakeGenericType(shaperLambda.ReturnType).GetConstructors()[0], Expression.Convert(QueryCompilationContext.QueryContextParameter, typeof(RelationalQueryContext)), Expression.Constant(relationalCommandCache), Expression.Constant(columnNames, typeof(IReadOnlyList <string>)), Expression.Constant(projectionColumns, typeof(IReadOnlyList <ReaderColumn>)), Expression.Constant(shaperLambda.Compile()), Expression.Constant(_contextType), Expression.Constant(_logger))); }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public static IRelationalCommand RentAndPopulateRelationalCommand(this RelationalCommandCache relationalCommandCache, RelationalQueryContext queryContext) { var relationalCommandTemplate = relationalCommandCache.GetRelationalCommandTemplate(queryContext.ParameterValues); var relationalCommand = queryContext.Connection.RentCommand(); relationalCommand.PopulateFrom(relationalCommandTemplate); return(relationalCommand); }
public Enumerator(QueryingEnumerable <T> queryingEnumerable) { _relationalQueryContext = queryingEnumerable._relationalQueryContext; _relationalCommandCache = queryingEnumerable._relationalCommandCache; _columnNames = queryingEnumerable._columnNames; _shaper = queryingEnumerable._shaper; _contextType = queryingEnumerable._contextType; _logger = queryingEnumerable._logger; }
public AsyncEnumerator(SingleQueryingEnumerable <T> queryingEnumerable) { _relationalQueryContext = queryingEnumerable._relationalQueryContext; _relationalCommandCache = queryingEnumerable._relationalCommandCache; _shaper = queryingEnumerable._shaper; _contextType = queryingEnumerable._contextType; _queryLogger = queryingEnumerable._queryLogger; _standAloneStateManager = queryingEnumerable._standAloneStateManager; _detailedErrorsEnabled = queryingEnumerable._detailedErrorsEnabled; Current = default !;
public AsyncEnumerator( QueryingEnumerable <T> queryingEnumerable, CancellationToken cancellationToken) { _relationalQueryContext = queryingEnumerable._relationalQueryContext; _relationalCommandCache = queryingEnumerable._relationalCommandCache; _columnNames = queryingEnumerable._columnNames; _shaper = queryingEnumerable._shaper; _contextType = queryingEnumerable._contextType; _logger = queryingEnumerable._logger; _cancellationToken = cancellationToken; }
public AsyncEnumerator(SplitQueryingEnumerable <T> queryingEnumerable) { _relationalQueryContext = queryingEnumerable._relationalQueryContext; _relationalCommandCache = queryingEnumerable._relationalCommandCache; _shaper = queryingEnumerable._shaper; _relatedDataLoaders = queryingEnumerable._relatedDataLoadersAsync; _contextType = queryingEnumerable._contextType; _queryLogger = queryingEnumerable._queryLogger; _standAloneStateManager = queryingEnumerable._standAloneStateManager; _detailedErrorEnabled = queryingEnumerable._detailedErrorsEnabled; _cancellationToken = _relationalQueryContext.CancellationToken; Current = default !;
public AsyncEnumerator(FromSqlQueryingEnumerable <T> queryingEnumerable) { _relationalQueryContext = queryingEnumerable._relationalQueryContext; _relationalCommandCache = queryingEnumerable._relationalCommandCache; _columnNames = queryingEnumerable._columnNames; _shaper = queryingEnumerable._shaper; _contextType = queryingEnumerable._contextType; _queryLogger = queryingEnumerable._queryLogger; _standAloneStateManager = queryingEnumerable._standAloneStateManager; _detailedErrorsEnabled = queryingEnumerable._detailedErrorsEnabled; _exceptionDetector = _relationalQueryContext.ExceptionDetector; Current = default !;
public QueryingEnumerable( RelationalQueryContext relationalQueryContext, RelationalCommandCache relationalCommandCache, IReadOnlyList <string> columnNames, Func <QueryContext, DbDataReader, ResultContext, int[], ResultCoordinator, T> shaper, Type contextType, IDiagnosticsLogger <DbLoggerCategory.Query> logger) { _relationalQueryContext = relationalQueryContext; _relationalCommandCache = relationalCommandCache; _columnNames = columnNames; _shaper = shaper; _contextType = contextType; _logger = logger; }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public SingleQueryingEnumerable( RelationalQueryContext relationalQueryContext, RelationalCommandCache relationalCommandCache, Func <QueryContext, DbDataReader, ResultContext, SingleQueryResultCoordinator, T> shaper, Type contextType, bool standAloneStateManager, bool detailedErrorsEnabled, bool threadSafetyChecksEnabled) { _relationalQueryContext = relationalQueryContext; _relationalCommandCache = relationalCommandCache; _shaper = shaper; _contextType = contextType; _queryLogger = relationalQueryContext.QueryLogger; _standAloneStateManager = standAloneStateManager; _detailedErrorsEnabled = detailedErrorsEnabled; _threadSafetyChecksEnabled = threadSafetyChecksEnabled; }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public FromSqlQueryingEnumerable( RelationalQueryContext relationalQueryContext, RelationalCommandCache relationalCommandCache, IReadOnlyList <string> columnNames, Func <QueryContext, DbDataReader, int[], T> shaper, Type contextType, bool standAloneStateManager, bool detailedErrorsEnabled, bool threadSafetyChecksEnabled) { _relationalQueryContext = relationalQueryContext; _relationalCommandCache = relationalCommandCache; _columnNames = columnNames; _shaper = shaper; _contextType = contextType; _queryLogger = relationalQueryContext.QueryLogger; _standAloneStateManager = standAloneStateManager; _detailedErrorsEnabled = detailedErrorsEnabled; _threadSafetyChecksEnabled = threadSafetyChecksEnabled; }
/// <summary> /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in /// any release. You should only use it directly in your code with extreme caution and knowing that /// doing so can result in application failures when updating to a new Entity Framework Core release. /// </summary> public SplitQueryingEnumerable( RelationalQueryContext relationalQueryContext, RelationalCommandCache relationalCommandCache, Func <QueryContext, DbDataReader, ResultContext, SplitQueryResultCoordinator, T> shaper, Action <QueryContext, IExecutionStrategy, SplitQueryResultCoordinator>?relatedDataLoaders, Func <QueryContext, IExecutionStrategy, SplitQueryResultCoordinator, Task>?relatedDataLoadersAsync, Type contextType, bool standAloneStateManager, bool detailedErrorsEnabled, bool threadSafetyChecksEnabled) { _relationalQueryContext = relationalQueryContext; _relationalCommandCache = relationalCommandCache; _shaper = shaper; _relatedDataLoaders = relatedDataLoaders; _relatedDataLoadersAsync = relatedDataLoadersAsync; _contextType = contextType; _queryLogger = relationalQueryContext.QueryLogger; _standAloneStateManager = standAloneStateManager; _detailedErrorsEnabled = detailedErrorsEnabled; _threadSafetyChecksEnabled = threadSafetyChecksEnabled; }
private static (IRelationalCommand, IRelationalTypeMappingSource) GetRelationalComponents_v2(RelationalCommandCache relationalCommandCache, QuerySqlGenerator sqlGenerator, IReadOnlyDictionary <string, object> parameterValues) { #pragma warning disable EF1001 // Internal EF Core API usage. var command = relationalCommandCache.GetRelationalCommand(parameterValues); #pragma warning restore EF1001 // Internal EF Core API usage. var dependencies = sqlGenerator.GetType().GetProperty("Dependencies", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(sqlGenerator) as QuerySqlGeneratorDependencies; var mappingSource = dependencies.RelationalCommandBuilderFactory.Create().TypeMappingSource; return(command, mappingSource); }