Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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);
        }