public IEnumerator <TModel> GetEnumerator() { var queryStrategy = _queryStrategyProvider.GetSelectStrategy( _queryTable.ModelStrategy, _skipCount, _takeCount, _whereClauses, _orderbyClauses); var sql = queryStrategy.GetDbQueryScript(); var dbparams = queryStrategy.GetDbParameters(); IDataReader reader = null; var items = new List <TModel>(); _serviceProvider.Open(); try { reader = _serviceProvider.QueryGetReader(sql, dbparams); if (_skipCount == 0 && _takeCount == 0) { var records = DbModelBindingHelper.GetDataRecords(reader); items.AddRange( records.Select(record => DbModelBindingHelper.BindingRecordToModel <TModel>( record, _queryTable.ModelStrategy.PropertyStrategies)) ); } else { while (reader.Read()) { items.Add(DbModelBindingHelper.BindingRecordToModel <TModel>( reader, _queryTable.ModelStrategy.PropertyStrategies)); } } } catch (Exception exception) { throw new DbOperationException("ERROR_SQL_EXECUTION_FAILED", exception, sql, dbparams); } finally { reader?.Close(); _serviceProvider.Close(); } return(items.GetEnumerator()); }
private TModel GetDataModelByPosition(QueryItemPosition position, long dataIndex = 0) { var queryStrategy = _queryStrategyProvider.GetSelectStrategy( _queryTable.ModelStrategy, _skipCount, _takeCount, _whereClauses, _orderbyClauses); var sql = queryStrategy.GetDbQueryScript(); var dbparams = queryStrategy.GetDbParameters().ToList(); IDataReader reader = null; TModel model = null; var singleError = false; _serviceProvider.Open(); try { reader = _serviceProvider.QueryGetReader(sql, dbparams); var dataAvailable = false; IDataRecord record = null; var idx = 0; switch (position) { case QueryItemPosition.Single: while (reader.Read()) { if (dataAvailable) { break; } if (idx > 1) { singleError = true; break; } idx++; dataAvailable = true; model = DbModelBindingHelper.BindingRecordToModel <TModel>( reader, _queryTable.ModelStrategy.PropertyStrategies); } break; case QueryItemPosition.ElementAt: idx = -1; while (reader.Read()) { idx++; if (idx == dataIndex) { record = reader; model = DbModelBindingHelper.BindingRecordToModel <TModel>( record, _queryTable.ModelStrategy.PropertyStrategies); break; } } break; case QueryItemPosition.First: reader.Read(); record = reader; model = DbModelBindingHelper.BindingRecordToModel <TModel>( record, _queryTable.ModelStrategy.PropertyStrategies); break; case QueryItemPosition.Last: while (reader.Read()) { record = reader; model = DbModelBindingHelper.BindingRecordToModel <TModel>( record, _queryTable.ModelStrategy.PropertyStrategies); } break; default: throw new NotSupportedException(); } } catch (Exception exception) { throw new DbOperationException("ERROR_SQL_EXECUTION_FAILED", exception, sql, dbparams); } finally { reader?.Close(); _serviceProvider.Close(); } if (singleError) { throw new InvalidOperationException("ERROR_OUT_OF_SINGLE_RECORD"); } return(model); }