Beispiel #1
0
                public async Task <bool> MoveNext(CancellationToken cancellationToken)
                {
                    try
                    {
                        if (_dataReader == null)
                        {
                            await _relationalQueryContext.Connection.OpenAsync(cancellationToken);

                            try
                            {
                                var selectExpression = new ParameterValueBasedSelectExpressionOptimizer(
                                    _sqlExpressionFactory,
                                    _parameterNameGeneratorFactory)
                                                       .Optimize(_selectExpression, _relationalQueryContext.ParameterValues);

                                var relationalCommand = _querySqlGeneratorFactory.Create().GetCommand(selectExpression);

                                _dataReader
                                    = await relationalCommand.ExecuteReaderAsync(
                                          _relationalQueryContext.Connection,
                                          _relationalQueryContext.ParameterValues,
                                          _relationalQueryContext.CommandLogger,
                                          cancellationToken);

                                _resultCoordinator = new ResultCoordinator();
                            }
                            catch (Exception)
                            {
                                // If failure happens creating the data reader, then it won't be available to
                                // handle closing the connection, so do it explicitly here to preserve ref counting.
                                _relationalQueryContext.Connection.Close();

                                throw;
                            }
                        }

                        var hasNext = _resultCoordinator.HasNext ?? await _dataReader.ReadAsync(cancellationToken);

                        _resultCoordinator.HasNext = null;

                        Current
                            = hasNext
                                ? await _shaper(_relationalQueryContext, _dataReader.DbDataReader, _resultCoordinator)
                                : default;

                        return(hasNext);
                    }
                    catch (Exception exception)
                    {
                        _logger.QueryIterationFailed(_contextType, exception);

                        throw;
                    }
                }
Beispiel #2
0
 public RelationalCommandCache(
     ISqlExpressionFactory sqlExpressionFactory,
     IParameterNameGeneratorFactory parameterNameGeneratorFactory,
     IQuerySqlGeneratorFactory querySqlGeneratorFactory,
     SelectExpression selectExpression)
 {
     _sqlExpressionFactory          = sqlExpressionFactory;
     _parameterNameGeneratorFactory = parameterNameGeneratorFactory;
     _querySqlGeneratorFactory      = querySqlGeneratorFactory;
     _selectExpression = selectExpression;
     _parameterValueBasedSelectExpressionOptimizer = new ParameterValueBasedSelectExpressionOptimizer(
         _sqlExpressionFactory,
         _parameterNameGeneratorFactory);
 }
            public RelationalCommandCache(
                IMemoryCache memoryCache,
                ISqlExpressionFactory sqlExpressionFactory,
                IParameterNameGeneratorFactory parameterNameGeneratorFactory,
                IQuerySqlGeneratorFactory querySqlGeneratorFactory,
                bool useRelationalNulls,
                SelectExpression selectExpression)
            {
                _memoryCache                   = memoryCache;
                _sqlExpressionFactory          = sqlExpressionFactory;
                _parameterNameGeneratorFactory = parameterNameGeneratorFactory;
                _querySqlGeneratorFactory      = querySqlGeneratorFactory;
                _selectExpression              = selectExpression;

                _parameterValueBasedSelectExpressionOptimizer = new ParameterValueBasedSelectExpressionOptimizer(
                    _sqlExpressionFactory,
                    _parameterNameGeneratorFactory,
                    useRelationalNulls);
            }
                public async ValueTask <bool> MoveNextAsync()
                {
                    try
                    {
                        using (_relationalQueryContext.ConcurrencyDetector.EnterCriticalSection())
                        {
                            if (_dataReader == null)
                            {
                                var selectExpression = new ParameterValueBasedSelectExpressionOptimizer(
                                    _sqlExpressionFactory,
                                    _parameterNameGeneratorFactory)
                                                       .Optimize(_selectExpression, _relationalQueryContext.ParameterValues);

                                var relationalCommand = _querySqlGeneratorFactory.Create().GetCommand(selectExpression);

                                _dataReader
                                    = await relationalCommand.ExecuteReaderAsync(
                                          new RelationalCommandParameterObject(
                                              _relationalQueryContext.Connection,
                                              _relationalQueryContext.ParameterValues,
                                              _relationalQueryContext.Context,
                                              _relationalQueryContext.CommandLogger),
                                          _cancellationToken);

                                if (selectExpression.IsNonComposedFromSql())
                                {
                                    var projection    = _selectExpression.Projection.ToList();
                                    var readerColumns = Enumerable.Range(0, _dataReader.DbDataReader.FieldCount)
                                                        .ToDictionary(i => _dataReader.DbDataReader.GetName(i), i => i, StringComparer.OrdinalIgnoreCase);

                                    _indexMap = new int[projection.Count];
                                    for (var i = 0; i < projection.Count; i++)
                                    {
                                        if (projection[i].Expression is ColumnExpression columnExpression)
                                        {
                                            var columnName = columnExpression.Name;
                                            if (columnName != null)
                                            {
                                                if (!readerColumns.TryGetValue(columnName, out var ordinal))
                                                {
                                                    throw new InvalidOperationException(RelationalStrings.FromSqlMissingColumn(columnName));
                                                }

                                                _indexMap[i] = ordinal;
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    _indexMap = null;
                                }

                                _resultCoordinator = new ResultCoordinator();
                            }

                            var hasNext = _resultCoordinator.HasNext ?? await _dataReader.ReadAsync();

                            Current = default;

                            if (hasNext)
                            {
                                while (true)
                                {
                                    _resultCoordinator.ResultReady = true;
                                    _resultCoordinator.HasNext     = null;
                                    Current = _shaper(
                                        _relationalQueryContext, _dataReader.DbDataReader,
                                        _resultCoordinator.ResultContext, _indexMap, _resultCoordinator);
                                    if (_resultCoordinator.ResultReady)
                                    {
                                        // We generated a result so null out previously stored values
                                        _resultCoordinator.ResultContext.Values = null;
                                        break;
                                    }

                                    if (!await _dataReader.ReadAsync())
                                    {
                                        _resultCoordinator.HasNext = false;
                                        // Enumeration has ended, materialize last element
                                        _resultCoordinator.ResultReady = true;
                                        Current = _shaper(
                                            _relationalQueryContext, _dataReader.DbDataReader,
                                            _resultCoordinator.ResultContext, _indexMap, _resultCoordinator);

                                        break;
                                    }
                                }
                            }

                            return(hasNext);
                        }
                    }
                    catch (Exception exception)
                    {
                        _logger.QueryIterationFailed(_contextType, exception);

                        throw;
                    }
                }
Beispiel #5
0
                public bool MoveNext()
                {
                    try
                    {
                        if (_dataReader == null)
                        {
                            var selectExpression = new ParameterValueBasedSelectExpressionOptimizer(
                                _sqlExpressionFactory,
                                _parameterNameGeneratorFactory)
                                                   .Optimize(_selectExpression, _relationalQueryContext.ParameterValues);

                            var relationalCommand = _querySqlGeneratorFactory.Create().GetCommand(selectExpression);

                            _dataReader
                                = relationalCommand.ExecuteReader(
                                      new RelationalCommandParameterObject(
                                          _relationalQueryContext.Connection,
                                          _relationalQueryContext.ParameterValues,
                                          _relationalQueryContext.Context,
                                          _relationalQueryContext.CommandLogger));

                            if (selectExpression.IsNonComposedFromSql())
                            {
                                var projection    = _selectExpression.Projection.ToList();
                                var readerColumns = Enumerable.Range(0, _dataReader.DbDataReader.FieldCount)
                                                    .ToDictionary(i => _dataReader.DbDataReader.GetName(i), i => i, StringComparer.OrdinalIgnoreCase);

                                _indexMap = new int[projection.Count];
                                for (var i = 0; i < projection.Count; i++)
                                {
                                    if (projection[i].Expression is ColumnExpression columnExpression)
                                    {
                                        var columnName = columnExpression.Name;
                                        if (columnName != null)
                                        {
                                            if (!readerColumns.TryGetValue(columnName, out var ordinal))
                                            {
                                                throw new InvalidOperationException(RelationalStrings.FromSqlMissingColumn(columnName));
                                            }

                                            _indexMap[i] = ordinal;
                                        }
                                    }
                                }
                            }
                            else
                            {
                                _indexMap = null;
                            }

                            _resultCoordinator = new ResultCoordinator();
                        }

                        var hasNext = _resultCoordinator.HasNext ?? _dataReader.Read();
                        Current = default;

                        if (hasNext)
                        {
                            while (true)
                            {
                                _resultCoordinator.ResultReady = true;
                                _resultCoordinator.HasNext     = null;
                                Current = _shaper(_relationalQueryContext, _dataReader.DbDataReader, Current, _indexMap, _resultCoordinator);
                                if (_resultCoordinator.ResultReady)
                                {
                                    break;
                                }

                                if (!_dataReader.Read())
                                {
                                    _resultCoordinator.HasNext = false;

                                    break;
                                }
                            }
                        }

                        return(hasNext);
                    }
                    catch (Exception exception)
                    {
                        _logger.QueryIterationFailed(_contextType, exception);

                        throw;
                    }
                }
                public bool MoveNext()
                {
                    try
                    {
                        if (_dataReader == null)
                        {
                            _relationalQueryContext.Connection.Open();

                            try
                            {
                                var projection = _selectExpression.Projection.ToList();

                                var selectExpression = new ParameterValueBasedSelectExpressionOptimizer(
                                    _sqlExpressionFactory,
                                    _parameterNameGeneratorFactory)
                                                       .Optimize(_selectExpression, _relationalQueryContext.ParameterValues);

                                var relationalCommand = _querySqlGeneratorFactory.Create().GetCommand(selectExpression);

                                _dataReader
                                    = relationalCommand.ExecuteReader(
                                          _relationalQueryContext.Connection,
                                          _relationalQueryContext.ParameterValues,
                                          _relationalQueryContext.CommandLogger);

                                var readerColumns = Enumerable.Range(0, _dataReader.DbDataReader.FieldCount)
                                                    .Select(
                                    i => new
                                {
                                    Name    = _dataReader.DbDataReader.GetName(i),
                                    Ordinal = i
                                }).ToList();

                                _indexMap = new int[projection.Count];

                                for (var i = 0; i < projection.Count; i++)
                                {
                                    if (projection[i].Expression is ColumnExpression columnExpression)
                                    {
                                        var columnName = columnExpression.Name;

                                        if (columnName != null)
                                        {
                                            var readerColumn
                                                = readerColumns.SingleOrDefault(
                                                      c =>
                                                      string.Equals(columnName, c.Name, StringComparison.OrdinalIgnoreCase));

                                            if (readerColumn == null)
                                            {
                                                throw new InvalidOperationException(RelationalStrings.FromSqlMissingColumn(columnName));
                                            }

                                            _indexMap[i] = readerColumn.Ordinal;
                                        }
                                    }
                                }
                            }
                            catch (Exception)
                            {
                                // If failure happens creating the data reader, then it won't be available to
                                // handle closing the connection, so do it explicitly here to preserve ref counting.
                                _relationalQueryContext.Connection.Close();

                                throw;
                            }
                        }

                        var hasNext = _dataReader.Read();

                        Current
                            = hasNext
                                ? _shaper(_relationalQueryContext, _dataReader.DbDataReader, _indexMap)
                                : default;

                        return(hasNext);
                    }
                    catch (Exception exception)
                    {
                        _logger.QueryIterationFailed(_contextType, exception);

                        throw;
                    }
                }