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;
}
}
}