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; } }
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; } }
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; } }