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)));
        }
Пример #2
0
        /// <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;
 }
Пример #4
0
 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;
 }
Пример #6
0
 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;
 }
Пример #12
0
        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);
        }