using System;
using System.Collections.Generic;
using Terrasoft.Core;
using Terrasoft.Core.DB;
using Terrasoft.Core.Entities;
 
namespace Norbit.Crm.EsPlus.Common
{
    /// <summary>
    /// Методы расширения для ESQ.
    /// </summary>
    public static class EsqExtensions
    {
        /// <summary>
        /// Постраничное чтение ESQ запроса.
        /// </summary>
        /// <param name="esq">Запрос.</param>
        /// <param name="userConnection">Пользовательское подключение.</param>
        /// <param name="rowCount">Количество считываемых записей за один раз(по умолчанию 1000).</param>
        /// <returns>Коллекция объектов из запроса.</returns>
        public static List<Entity> GetEntityCollectionPaginatedReading(
            this EntitySchemaQuery esq,
            UserConnection userConnection,
            EntitySchemaQueryOptions options = null,
            int rowCount = 1000)
        {
            if (esq == null)
            {
                throw new ArgumentNullException(nameof(esq));
            }
 
            if (userConnection == null)
            {
                throw new ArgumentNullException(nameof(userConnection));
            }
 
            var entityCollection = new List<Entity>();
            esq.UseOffsetFetchPaging = true;                              /// Использовать постраничное чтение.
 
            var esqOptions = options ?? new EntitySchemaQueryOptions                     /// Настройки получения коллекции.
            {
                PageableRowCount = rowCount,                             /// Количество считываемых записей.
                RowsOffset = 0,                                          /// Количество записей, которые необходимо пропустить
                PageableDirection = PageableSelectDirection.Next,
                PageableConditionValues = new Dictionary<string, object>()
            };
 
            var entities = esq.GetEntityCollection(userConnection, esqOptions);
 
            while (entities.Count > 0)
            {
                foreach (var entity in entities)
                {
                    entityCollection.Add(entity);
                }
                esqOptions.RowsOffset += esqOptions.PageableRowCount;
                esq.ResetSelectQuery();                                     /// Обнуление результата запроса.
                entities = esq.GetEntityCollection(userConnection, esqOptions);
            }
 
            return entityCollection;
        }
 
    }
}

 

Нравится

Поделиться

1 комментарий

Есть подозрение. что поможет 

PageableDirection = PageableSelectDirection.First  при первом запросе.

потом сменить на Next

Показать все комментарии