/// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="dataSource"></param>
 /// <param name="recordValues">Instancia do registro que será processado.</param>
 /// <param name="recordDescriptor"></param>
 /// <param name="entityTypeName">Nome do tipo da entidade associada.</param>
 public RegisterRecordAsyncTask(DynamicQueryDataSource dataSource, object[] recordValues, Record.RecordDescriptor recordDescriptor, Colosoft.Reflection.TypeName entityTypeName)
 {
     _dataSource       = dataSource;
     _recordValues     = recordValues;
     _recordDescriptor = recordDescriptor;
     _entityTypeName   = entityTypeName;
 }
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="dataSource">Oridem dos dados.</param>
 /// <param name="descriptor">Descritor dos registros.</param>
 /// <param name="firstRecord">Instancia do primeiro registro.</param>
 /// <param name="enumerator">Enumerador dos registros.</param>
 public GetRecordsEnumerator(GenericSqlQueryDataSource dataSource, Record.RecordDescriptor descriptor, Record firstRecord, IEnumerator <GDADataRecord> enumerator)
 {
     _dataSource  = dataSource;
     _descriptor  = descriptor;
     _enumerator  = enumerator;
     _firstRecord = firstRecord;
 }
예제 #3
0
        /// <summary>
        /// Cria o comparador para ordena os resultado da consulta.
        /// </summary>
        /// <param name="query">Informações da consulta.</param>
        /// <param name="descriptor">Descritor com assinatura dos dados do resultado.</param>
        /// <returns></returns>
        private static IComparer <Record> CreateSortComparer(QueryInfo query, Record.RecordDescriptor descriptor)
        {
            IComparer <Record> comparer = null;
            var fields = new List <Colosoft.Query.RecordSortComparer.Field>();

            foreach (var sortPart in query.Sort)
            {
                var sortPartName = sortPart.Name;
                if (string.IsNullOrEmpty(sortPartName))
                {
                    throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.NotSupportedException_InvalidSortEntryFormat).Format());
                }
                for (var i = 0; i < descriptor.Count; i++)
                {
                    if (descriptor[i].Name == sortPartName)
                    {
                        fields.Add(new Colosoft.Query.RecordSortComparer.Field(i, sortPart.Reverse));
                        break;
                    }
                }
            }
            if (fields.Count > 0)
            {
                comparer = new Colosoft.Query.RecordSortComparer(fields);
            }
            return(comparer);
        }
예제 #4
0
        /// <summary>
        /// Gera um <see cref="Record"/> a partir de um parâmetro de persistência
        /// </summary>
        /// <returns><see cref="Record"/> gerado</returns>
        public Record ToRecord()
        {
            List <Record.Field> fields = new List <Record.Field>();

            object[] values = new object[Parameters != null ? Parameters.Length : 0];
            for (int i = 0; i < values.Length; i++)
            {
                fields.Add(new Record.Field(Parameters[i].Name, (Parameters[i].Value != null) ? Parameters[i].Value.GetType() : typeof(object)));
                values[i] = Parameters[i].Value;
            }
            Record.RecordDescriptor descriptor = new Record.RecordDescriptor("descriptor", fields);
            return(descriptor.CreateRecord(values));
        }
        protected virtual QueryResult ExecuteStoredProcedure(GDASession session, QueryInfo queryInfo)
        {
            var da = new DataAccess(session.ProviderConfiguration);
            IEnumerable <int> outputParametersIndexes;
            var procedure = GenerateGDAStoredProcedure(queryInfo, out outputParametersIndexes);

            procedure.CommandTimeout = queryInfo.CommandTimeout;
            IEnumerator <GDADataRecord> dataRecordEnumerator = da.LoadResult(session, procedure).GetEnumerator();
            IEnumerable <Record>        records = null;

            Record.RecordDescriptor descriptor = null;
            foreach (int index in outputParametersIndexes)
            {
                queryInfo.Parameters[index].Value = procedure[index];
            }
            if (dataRecordEnumerator.MoveNext())
            {
                var dataRecord = dataRecordEnumerator.Current;
                var fields     = new List <Record.Field>();
                for (int i = 0; i < dataRecord.FieldCount; i++)
                {
                    var value = dataRecord[i].GetValue();
                    var name  = dataRecord.GetName(i);
                    if (string.IsNullOrEmpty(name))
                    {
                        name = DataAccessConstants.ReturnValueColumnName;
                    }
                    fields.Add(new Record.Field(name, dataRecord.GetFieldType(i)));
                }
                descriptor = new Record.RecordDescriptor("descriptor", fields);
                var firstRecord = GetRecord(descriptor, dataRecord);
                records = GetRecords(descriptor, firstRecord, dataRecordEnumerator);
            }
            else
            {
                records = new Record[0];
            }
            var result = new QueryResult(descriptor, records, queryInfo, f => Execute(session, f));

            result.Validate().ThrowInvalid();
            return(result);
        }
        /// <summary>
        /// Recupera os dados do registro.
        /// </summary>
        /// <param name="descriptor"></param>
        /// <param name="record"></param>
        /// <returns></returns>
        protected Record GetRecord(Record.RecordDescriptor descriptor, GDADataRecord record)
        {
            var values = new object[descriptor.Count];

            for (int i = 0; i < values.Length; i++)
            {
                var field     = descriptor[i];
                var fieldName = field.Name;
                if (fieldName == DataAccessConstants.ReturnValueColumnName)
                {
                    fieldName = "";
                }
                values[i] = GetValue(i, record, field.Type);
                if (field.Type == typeof(object) && values[i] is byte[])
                {
                    field.ChangeFieldType(typeof(byte[]));
                }
            }
            return(descriptor.CreateRecord(values));
        }
        private QueryResult ExecuteQuery(GDASession session, string commandText, QueryInfo queryInfo)
        {
            var query = new GDA.Sql.NativeQuery(commandText)
            {
                Query.QueryParameter.GetParameters(queryInfo, false).Select(f => CreateParameter(f.Name, f.Value)).GroupBy(f => f.ParameterName).Where(f => ContainsParameter(commandText, f.Key)).Select(f => f.FirstOrDefault())
            };

            query.CommandTimeout = queryInfo.CommandTimeout;
            if (queryInfo.TakeParameters != null)
            {
                if (queryInfo.TakeParameters.Skip > 0)
                {
                    query.Skip(queryInfo.TakeParameters.Skip);
                }
                if (queryInfo.TakeParameters.Take > 0)
                {
                    query.Take(queryInfo.TakeParameters.Take);
                }
            }
            IEnumerator <GDADataRecord> dataRecordEnumerator = query.ToDataRecords(session).GetEnumerator();
            IEnumerable <Record>        records = null;

            Record.RecordDescriptor descriptor = null;
            if (dataRecordEnumerator.MoveNext())
            {
                var dataRecord = dataRecordEnumerator.Current;
                descriptor = GetRecordDescriptor(queryInfo, query, dataRecord);
                var firstRecord = GetRecord(descriptor, dataRecord);
                records = GetRecords(descriptor, firstRecord, dataRecordEnumerator);
            }
            else
            {
                records = new Record[0];
            }
            var result = new QueryResult(descriptor, records, queryInfo, f => Execute(session, f));

            result.Validate().ThrowInvalid();
            return(result);
        }
 /// <summary>
 /// Recupera a enumeração
 /// </summary>
 /// <param name="descriptor">Descritor dos campos dos registros.</param>
 /// <param name="firstRecord">Instancia do primeiro registro encontrado.</param>
 /// <param name="recordsEnumerator">Enumerador dos registros</param>
 /// <returns></returns>
 protected IEnumerable <Record> GetRecords(Record.RecordDescriptor descriptor, Record firstRecord, IEnumerator <GDADataRecord> recordsEnumerator)
 {
     return(new RecordsEnumerable(this, descriptor, firstRecord, recordsEnumerator));
 }
        protected override QueryResult ExecuteStoredProcedure(GDASession a, QueryInfo b)
        {
            DataAccess c = a != null ? new DataAccess(a.ProviderConfiguration) : new DataAccess();
            var        d = new List <int> ();
            var        e = (TranslatedStoredProcedureName)Translator.GetName(b.StoredProcedureName);
            var        f = "BEGIN " + (!string.IsNullOrEmpty(e.Schema) ? string.Format("\"{0}\".\"{1}\"", e.Schema, e.Name) : string.Format("\"{0}\"", e.Name)) + " (";

            for (var g = 1; g <= b.Parameters.Count + 1; g++)
            {
                f += ":" + g + ",";
            }
            f = f.Substring(0, f.Length - 1) + "); END;";
            var h = new GDA.Collections.GDAParameterCollection();

            for (int g = 0; g < b.Parameters.Count; g++)
            {
                var i = (System.Data.ParameterDirection)((int)b.Parameters [g].Direction);
                h.Add(new GDAParameter(":" + (g + 1), b.Parameters [g].Value, i));
                if (b.Parameters [g].Direction != ParameterDirection.Input)
                {
                    d.Add(g);
                }
            }
                        #if DEVART
            // Cria o parametro é que referência do cursor
            var j = new GDAParameter(":" + (b.Parameters.Count + 1), null)
            {
                NativeDbType = Devart.Data.Oracle.OracleDbType.Cursor, Direction = System.Data.ParameterDirection.Output
            };
#else
            var j = new GDAParameter(":" + (b.Parameters.Count + 1), null)
            {
                DbType    = (System.Data.DbType) 13,
                Direction = System.Data.ParameterDirection.Output
            };
                        #endif
            h.Add(j);
            c.ExecuteCommand(a, System.Data.CommandType.Text, b.CommandTimeout, f, h.ToArray());
            IEnumerator <GDADataRecord> k = NavigateRefCursor(j).GetEnumerator();
            IEnumerable <Record>        l = null;
            Record.RecordDescriptor     m = null;
            foreach (int index in d)
            {
                b.Parameters [index].Value = h [index].Value;
            }
            try {
                if (k.MoveNext())
                {
                    var n = k.Current;
                    var o = new List <Record.Field> ();
                    for (int g = 0; g < n.FieldCount; g++)
                    {
                        var p = n [g].GetValue();
                        var q = n.GetName(g);
                        if (string.IsNullOrEmpty(q))
                        {
                            q = "return_value";
                        }
                        o.Add(new Record.Field(q, n.GetFieldType(g)));
                    }
                    m = new Record.RecordDescriptor("descriptor", o);
                    var r = GetRecord(m, n);
                    l = GetRecords(m, r, k);
                }
                else
                {
                    k.Dispose();
                    l = new Record[0];
                }
            }
            catch {
                k.Dispose();
                throw;
            }
            var s = new QueryResult(m, l, b, t => Execute(a, t));
            s.Validate().ThrowInvalid();
            return(s);
        }
        protected override QueryResult ExecuteStoredProcedure(GDASession session, QueryInfo queryInfo)
        {
            DataAccess da                  = session != null ? new DataAccess(session.ProviderConfiguration) : new DataAccess();
            var        indexes             = new List <int>();
            var        storedProcedureName = (TranslatedStoredProcedureName)Translator.GetName(queryInfo.StoredProcedureName);
            var        script              = "BEGIN " + (!string.IsNullOrEmpty(storedProcedureName.Schema) ? string.Format("\"{0}\".\"{1}\"", storedProcedureName.Schema, storedProcedureName.Name) : string.Format("\"{0}\"", storedProcedureName.Name)) + " (";

            for (var i = 1; i <= queryInfo.Parameters.Count + 1; i++)
            {
                script += ":" + i + ",";
            }
            script = script.Substring(0, script.Length - 1) + "); END;";
            var parameters = new GDA.Collections.GDAParameterCollection();

            for (int i = 0; i < queryInfo.Parameters.Count; i++)
            {
                var paramDirection = (System.Data.ParameterDirection)((int)queryInfo.Parameters[i].Direction);
                parameters.Add(new GDAParameter(":" + (i + 1), queryInfo.Parameters[i].Value, paramDirection));
                if (queryInfo.Parameters[i].Direction != ParameterDirection.Input)
                {
                    indexes.Add(i);
                }
            }
                        #if DEVART
            // Cria o parametro é que referência do cursor
            var refCursorParameter = new GDAParameter(":" + (queryInfo.Parameters.Count + 1), null)
            {
                NativeDbType = Devart.Data.Oracle.OracleDbType.Cursor, Direction = System.Data.ParameterDirection.Output
            };
#else
            var refCursorParameter = new GDAParameter(":" + (queryInfo.Parameters.Count + 1), null)
            {
                DbType    = (System.Data.DbType) 13,
                Direction = System.Data.ParameterDirection.Output
            };
                        #endif
            parameters.Add(refCursorParameter);
            da.ExecuteCommand(session, System.Data.CommandType.Text, queryInfo.CommandTimeout, script, parameters.ToArray());
            IEnumerator <GDADataRecord> dataRecordEnumerator = NavigateRefCursor(refCursorParameter).GetEnumerator();
            IEnumerable <Record>        records    = null;
            Record.RecordDescriptor     descriptor = null;
            foreach (int index in indexes)
            {
                queryInfo.Parameters[index].Value = parameters[index].Value;
            }
            try
            {
                if (dataRecordEnumerator.MoveNext())
                {
                    var dataRecord = dataRecordEnumerator.Current;
                    var fields     = new List <Record.Field>();
                    for (int i = 0; i < dataRecord.FieldCount; i++)
                    {
                        var value = dataRecord[i].GetValue();
                        var name  = dataRecord.GetName(i);
                        if (string.IsNullOrEmpty(name))
                        {
                            name = "return_value";
                        }
                        fields.Add(new Record.Field(name, dataRecord.GetFieldType(i)));
                    }
                    descriptor = new Record.RecordDescriptor("descriptor", fields);
                    var firstRecord = GetRecord(descriptor, dataRecord);
                    records = GetRecords(descriptor, firstRecord, dataRecordEnumerator);
                }
                else
                {
                    dataRecordEnumerator.Dispose();
                    records = new Record[0];
                }
            }
            catch
            {
                dataRecordEnumerator.Dispose();
                throw;
            }
            var result = new QueryResult(descriptor, records, queryInfo, f => Execute(session, f));
            result.Validate().ThrowInvalid();
            return(result);
        }
예제 #11
0
        /// <summary>
        /// Cria um registro com base nas chaves do resultado da consulta.
        /// </summary>
        /// <param name="entities"></param>
        /// <param name="keys"></param>
        /// <returns></returns>
        private Record CreateRecord(EntityInfo[] entities, object[] keys)
        {
            var entries = new object[entities.Length];

            for (var i = 0; i < keys.Length; i++)
            {
                if (keys[i] != null)
                {
                    var entry = _cache[keys[i]];
                    if (entry is UserBinaryObject)
                    {
                        var binaryObject = (UserBinaryObject)entry;
                        using (var ms = new System.IO.MemoryStream(binaryObject.GetFullObject(), false))
                            entry = Colosoft.Serialization.Formatters.CompactBinaryFormatter.Deserialize(ms, _cache.Name);
                    }
                    entries[i] = entry;
                }
            }
            PropertyInfo[][] propertyInfos = null;
            if (_descriptor == null)
            {
                var descriptor = new Record.RecordDescriptor();
                _projectionPositions = new List <KeyValuePair <int, string> >();
                if (_query == null || _query.Projection == null || _query.Projection.Count == 0)
                {
                    var entitiesIndex = new List <int>();
                    if (_query != null)
                    {
                        foreach (var info in _query.Entities)
                        {
                            var index = Array.FindIndex(entities, f => !string.IsNullOrEmpty(f.Alias) ? f.Alias == info.Alias : f.FullName == info.FullName);
                            if (index >= 0)
                            {
                                entitiesIndex.Add(index);
                            }
                        }
                    }
                    else
                    {
                        for (var i = 0; i < entities.Length; i++)
                        {
                            entitiesIndex.Add(i);
                        }
                    }
                    foreach (var i in entitiesIndex)
                    {
                        var typeMetadata = GetTypeMetadata(entities[i]);
                        if (typeMetadata == null)
                        {
                            throw new InvalidOperationException(string.Format("Not found TypeMetadata for entity '{0}'", entities[i]));
                        }
                        foreach (var property in typeMetadata)
                        {
                            var index = 0;
                            while (descriptor.Contains(property.Name + (index > 0 ? index.ToString() : "")))
                            {
                                index++;
                            }
                            descriptor.Add(new Record.Field(property.Name + (index > 0 ? index.ToString() : ""), Type.GetType(property.PropertyType, true)));
                            _projectionPositions.Add(new KeyValuePair <int, string>(i, property.Name));
                        }
                        if (typeMetadata.IsVersioned && !descriptor.Contains("RowVersion"))
                        {
                            descriptor.Add(new Record.Field("RowVersion", typeof(long)));
                            _projectionPositions.Add(new KeyValuePair <int, string>(i, "RowVersion"));
                        }
                    }
                }
                else
                {
                    var typeMetadatas = new Dictionary <int, ITypeMetadata>();
                    foreach (var projectionEntry in _query.Projection)
                    {
                        var columnInfo = projectionEntry.GetColumnInfo();
                        if (columnInfo == null)
                        {
                            continue;
                        }
                        var entityInfo = _query.Entities.Where(f => f.Alias == columnInfo.Owner).FirstOrDefault();
                        if (entityInfo == null)
                        {
                            entityInfo = _query.Entities.FirstOrDefault();
                        }
                        var entityIndex = -1;
                        for (var i = 0; i < entities.Length; i++)
                        {
                            if (EntityInfoAliasComparer.Instance.Equals(entities[i], entityInfo))
                            {
                                entityIndex = i;
                                break;
                            }
                        }
                        var name  = columnInfo.Alias ?? columnInfo.Name;
                        var index = 0;
                        while (descriptor.Contains(name + (index > 0 ? index.ToString() : "")))
                        {
                            index++;
                        }
                        if (index > 0)
                        {
                            name += index.ToString();
                        }
                        if (entityIndex < 0)
                        {
                            descriptor.Add(new Record.Field(name, typeof(string)));
                            _projectionPositions.Add(new KeyValuePair <int, string>(-1, null));
                            continue;
                        }
                        ITypeMetadata typeMetadata = null;
                        if (!typeMetadatas.TryGetValue(entityIndex, out typeMetadata))
                        {
                            typeMetadata = GetTypeMetadata(entities[entityIndex]);
                            if (typeMetadata == null)
                            {
                                throw new InvalidOperationException(string.Format("Not found TypeMetadata for entity '{0}'", entities[entityIndex]));
                            }
                            typeMetadatas.Add(entityIndex, typeMetadata);
                        }
                        if (columnInfo.Name == "TableId")
                        {
                            var identityProperty = typeMetadata.GetKeyProperties().FirstOrDefault();
                            if (identityProperty != null)
                            {
                                descriptor.Add(new Record.Field(name, Type.GetType(identityProperty.PropertyType)));
                                _projectionPositions.Add(new KeyValuePair <int, string>(entityIndex, identityProperty.Name));
                            }
                        }
                        else if (columnInfo.Name == Colosoft.Query.DataAccessConstants.RowVersionPropertyName && typeMetadata.IsVersioned)
                        {
                            descriptor.Add(new Record.Field(name, typeof(long)));
                            _projectionPositions.Add(new KeyValuePair <int, string>(entityIndex, Colosoft.Query.DataAccessConstants.RowVersionPropertyName));
                            break;
                        }
                        else
                        {
                            foreach (var property in typeMetadata)
                            {
                                if (property.Name == columnInfo.Name)
                                {
                                    descriptor.Add(new Record.Field(name, Type.GetType(property.PropertyType)));
                                    _projectionPositions.Add(new KeyValuePair <int, string>(entityIndex, property.Name));
                                    break;
                                }
                            }
                        }
                    }
                }
                _descriptor = descriptor;
            }
            object[] values = new object[_descriptor.Count];
            for (var projIndex = 0; projIndex < _projectionPositions.Count; projIndex++)
            {
                var projPosition = _projectionPositions[projIndex];
                if (projPosition.Key < 0)
                {
                    continue;
                }
                var entry = entries[projPosition.Key];
                if (entry == null)
                {
                    continue;
                }
                if (entry is ICacheItemRecord)
                {
                    var itemRecord = (ICacheItemRecord)entry;
                    if (itemRecord.Descriptor.Contains(projPosition.Value))
                    {
                        values[projIndex] = itemRecord.GetValue(projPosition.Value);
                    }
                }
                else
                {
                    if (propertyInfos == null)
                    {
                        propertyInfos = new PropertyInfo[entries.Length][];
                    }
                    if (propertyInfos[projPosition.Key] == null && entry != null)
                    {
                        propertyInfos[projPosition.Key] = entry.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(f => f.Name).ToArray();
                    }
                    if (entry != null)
                    {
                        var propertyInfo = propertyInfos[projPosition.Key].Where(f => f.Name == projPosition.Value).FirstOrDefault();
                        if (propertyInfo != null)
                        {
                            values[projIndex] = propertyInfo.GetValue(entry, null);
                        }
                    }
                }
            }
            return(_descriptor.CreateRecord(values));
        }
예제 #12
0
        /// <summary>
        /// Cria um record a partir de um valor.
        /// </summary>
        /// <param name="cache">Instancia do cache onde está os dados.</param>
        /// <param name="key">Chave da entrada do cache.</param>
        /// <param name="descriptor">Descritor do resultado.</param>
        /// <param name="info"></param>
        /// <returns></returns>
        internal static Record CreateRecord(Cache cache, object key, ref Record.RecordDescriptor descriptor, QueryInfo info)
        {
            var resultValue = cache[key];

            if (resultValue is UserBinaryObject)
            {
                var binaryObject = (UserBinaryObject)resultValue;
                using (var ms = new System.IO.MemoryStream(binaryObject.GetFullObject(), false))
                    resultValue = Colosoft.Serialization.Formatters.CompactBinaryFormatter.Deserialize(ms, cache.Name);
            }
            if (resultValue is ICacheItemRecord)
            {
                var itemRecord = (ICacheItemRecord)resultValue;
                if (descriptor.Count == 0)
                {
                    if (info != null && info.Projection != null)
                    {
                        descriptor = new Record.RecordDescriptor();
                        foreach (var field in itemRecord.Descriptor)
                        {
                            if (info.Projection.Any(p => {
                                var column = p.GetColumnInfo();
                                return(column != null && column.Name == field.Name);
                            }))
                            {
                                descriptor.Add(field);
                            }
                        }
                    }
                    else
                    {
                        descriptor = itemRecord.Descriptor;
                    }
                }
                object[] values = new object[descriptor.Count];
                for (int i = 0; i < descriptor.Count; i++)
                {
                    values[i] = itemRecord.GetValue(descriptor[i].Name);
                }
                return(descriptor.CreateRecord(values));
            }
            else
            {
                var propertyInfos = resultValue.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).OrderBy(f => f.Name).ToArray();
                if (descriptor.Count == 0)
                {
                    List <Record.Field> fields = new List <Record.Field>();
                    for (int i = 0; i < propertyInfos.Length; i++)
                    {
                        fields.Add(new Record.Field(propertyInfos[i].Name, propertyInfos[i].ReflectedType));
                    }
                    descriptor = new Record.RecordDescriptor("descriptor", fields);
                }
                object[] values = new object[descriptor.Count];
                for (int i = 0; i < values.Length; i++)
                {
                    values[i] = propertyInfos[i].GetValue(resultValue, null);
                }
                return(descriptor.CreateRecord(values));
            }
        }
예제 #13
0
        public IQueryResult Execute(QueryInfo query)
        {
            query.Require("query").NotNull();
                        #if DEBUG
            var queryText     = query.ToString().Replace("\r\n", " ");
            var executeNumber = _executeCount++;

            var stopwatch = new System.Diagnostics.Stopwatch();
            stopwatch.Start();
#endif
            try
            {
                var cacheResult = ExecuteInCache(query);
                Record.RecordDescriptor descriptor = new Record.RecordDescriptor();
                if (query.Projection != null && query.Projection.Count == 1 && IsCountFunction(query.Projection[0]))
                {
                    var projectionColumn = query.Projection[0];
                    descriptor.Add(new Record.Field(projectionColumn.Alias, typeof(int)));
                    return(new QueryResult(descriptor, new Record[] {
                        descriptor.CreateRecord(new object[] {
                            cacheResult.SearchKeysResult.Count
                        })
                    }, query, Execute));
                }
                var records = new List <Record>();
                IComparer <Record> comparer = null;
                var comparerInitialized     = false;
                using (var recordsEnumerator = new QueryResultSetRecordEnumerator(this._typeSchema, this.Cache, cacheResult, query))
                {
                    while (recordsEnumerator.MoveNext())
                    {
                        var record = recordsEnumerator.Current;
                        descriptor = recordsEnumerator.Descriptor;
                        if (!comparerInitialized && query.Sort != null)
                        {
                            comparerInitialized = true;
                            comparer            = CreateSortComparer(query, descriptor);
                        }
                        if (comparerInitialized)
                        {
                            var index = records.BinarySearch(record, comparer);
                            if (index < 0)
                            {
                                index = ~index;
                            }
                            records.Insert(index, record);
                        }
                        else
                        {
                            records.Add(record);
                        }
                    }
                }
                return(new QueryResult(descriptor, new RecordsResult(records), query, Execute));
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                                #if DEBUG
                stopwatch.Stop();
                RegisterEndExecute(stopwatch, queryText, executeNumber);
#endif
            }
        }