public IEnumerable <IRow> Read() { using (var cn = _factory.GetConnection()) { cn.Open(); var cmd = cn.CreateCommand(); if (string.IsNullOrEmpty(_input.Entity.Query)) { if (_input.Entity.MinVersion == null) { cmd.CommandText = _input.SqlSelectInput(_fields, _factory, _input.ResolveOrder); if (_input.Entity.IsPageRequest()) { var start = (_input.Entity.Page * _input.Entity.PageSize) - _input.Entity.PageSize; var end = start + _input.Entity.PageSize; switch (_factory.AdoProvider) { case AdoProvider.SqlServer: cmd.CommandText = $"WITH p AS ({cmd.CommandText}) SELECT {string.Join(",", _fields.Select(f => _factory.Enclose(f.Name)))} FROM p WHERE TflRow BETWEEN {start + 1} AND {end}"; break; case AdoProvider.PostgreSql: cmd.CommandText += $" LIMIT {_input.Entity.PageSize} OFFSET {start}"; break; default: cmd.CommandText += $" LIMIT {start},{_input.Entity.PageSize}"; break; } } _input.Debug(() => cmd.CommandText); } else { cmd.CommandText = _input.SqlSelectInputWithMinVersion(_fields, _factory, _input.ResolveOrder); _input.Debug(() => cmd.CommandText); var parameter = cmd.CreateParameter(); parameter.ParameterName = "@MinVersion"; parameter.Direction = ParameterDirection.Input; parameter.Value = _input.Entity.MinVersion; cmd.Parameters.Add(parameter); } if (_input.Entity.IsPageRequest()) { var sql = $"SELECT COUNT(*) FROM {_input.SqlInputName(_factory)} {(_factory.AdoProvider == AdoProvider.SqlServer ? "WITH (NOLOCK)" : string.Empty)} {(_input.Entity.Filter.Any() ? " WHERE " + _input.ResolveFilter(_factory) : string.Empty)}"; _input.Debug(() => sql); _input.Entity.Hits = cn.ExecuteScalar <int>(sql); } _input.Entity.Query = cmd.CommandText; } else { cmd.CommandText = _input.Entity.Query; } cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 0; using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) { // transform types if sqlite if (_factory.AdoProvider == AdoProvider.SqLite) { while (reader.Read()) { _rowCount++; _input.Increment(); var row = _rowCreator.Create(reader, _fields); _typeTransform.Transform(row); yield return(row); } } else { // check the first one's types if (reader.Read()) { var row = _rowCreator.Create(reader, _fields); foreach (var field in _fields) { var expected = Constants.TypeSystem()[field.Type]; var actual = row[field] == null ? expected : row[field].GetType(); if (expected != actual) { _input.Warn($"The {field.Alias} field in {_input.Entity.Alias} expects a {expected}, but is reading a {actual}."); } } _rowCount++; _input.Increment(); yield return(row); } // just read while (reader.Read()) { _rowCount++; _input.Increment(); yield return(_rowCreator.Create(reader, _fields)); } } } _input.Info("{0} from {1}", _rowCount, _input.Connection.Name); } }
public IEnumerable <IRow> Read(IEnumerable <IRow> input) { return(_reader.Read(input).Select(r => _typeTransform.Transform(r))); }
public IEnumerable <IRow> Read() { using (var cn = _factory.GetConnection()) { cn.Open(); var cmd = cn.CreateCommand(); if (string.IsNullOrEmpty(_input.Entity.Query)) { if (_input.Entity.MinVersion == null) { cmd.CommandText = _input.SqlSelectInput(_fields, _factory); _input.Debug(() => cmd.CommandText); } else { cmd.CommandText = _input.SqlSelectInputWithMinVersion(_fields, _factory); _input.Debug(() => cmd.CommandText); var parameter = cmd.CreateParameter(); parameter.ParameterName = "@MinVersion"; parameter.Direction = ParameterDirection.Input; parameter.Value = _input.Entity.MinVersion; cmd.Parameters.Add(parameter); } if (_input.Entity.IsPageRequest()) { var sql = $"SELECT COUNT(*) FROM {_input.SqlInputName(_factory)} {(_factory.AdoProvider == AdoProvider.SqlServer ? "WITH (NOLOCK)" : string.Empty)} {(_input.Entity.Filter.Any() ? " WHERE " + _input.ResolveFilter(_factory) : string.Empty)}"; _input.Debug(() => sql); try { _input.Entity.Hits = cn.ExecuteScalar <int>(sql); } catch (Exception ex) { _input.Error(ex.Message); } } _input.Entity.Query = cmd.CommandText; } else { cmd.CommandText = _input.Entity.Query; } cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 0; IDataReader reader = null; try { reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); } catch (Exception ex) { _input.Error(ex.Message); yield break; } using (reader) { if (_fields.Length < reader.FieldCount) { _input.Warn($"The reader is returning {reader.FieldCount} fields, but the entity {_input.Entity.Alias} expects {_fields.Length}!"); } // transform types if sqlite if (_factory.AdoProvider == AdoProvider.SqLite) { while (reader.Read()) { _rowCount++; _input.Increment(); var row = _rowCreator.Create(reader, _fields); _typeTransform.Transform(row); yield return(row); } } else { // check the first one's types if (reader.Read()) { var row = _rowCreator.Create(reader, _fields); foreach (var field in _fields) { var expected = Constants.TypeSystem()[field.Type]; var actual = row[field] == null ? expected : row[field].GetType(); if (expected != actual) { _input.Warn( $"The {field.Alias} field in {_input.Entity.Alias} expects a {expected}, but is reading a {actual}."); } } _rowCount++; _input.Increment(); yield return(row); } // just read while (reader.Read()) { _rowCount++; _input.Increment(); yield return(_rowCreator.Create(reader, _fields)); } } } _input.Info("{0} from {1}", _rowCount, _input.Connection.Name); } }