Пропустить и взять не работает для источника данных IQueryable - PullRequest
1 голос
/ 04 июня 2019

У меня есть общий метод для всех объектов в слое моего сервиса с именем «GetBaseEntity». Это в основном имеет определение:

public IQueryable<TEntity> GetBaseEntity(bool includeNavigation = true, bool isAdmin = false)
{
    var objBase = _context.EntityName;

    if (isAdmin)
    {
        return objBase;
    }

    return objBase.Where(x => x.IsActive == true && x.IsDeleted == false);
}

Возвращает IQueryable типа TEntity. Я хочу динамически передавать параметры разбиения на страницы в методе, поэтому я реализовал его следующим образом:

public async Task<IEnumerable<EntityDto>> LoadResources(PagingOptions pagingOptions)
{
    var baseQuery = GetBaseEntity();

    if (pagingOptions != null)
    {
        baseQuery
            .Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value)
            .Take(pagingOptions.Limit.Value);
    } 

    // I can actually return from this part but I just
    // set it to a variable to see how many rows the query will return
    var query = await baseQuery
        .ProjectTo<EntityDto>(_mappingConfiguration)
        .ToListAsync();

        return query;
}

Однако запрос по-прежнему возвращает весь набор. Я предполагаю, что GetBaseEntity () просто настраивает запрос, но выполнение применяется к LoadResourcesMethod, где я применил ToListAsync () в методе LoadResources.

Я пробовал следующее, но это не сработало:

1) не цепочка запроса ( IQueryable с Entity Framework - порядок, где пропустить и принять не имеют никакого эффекта )

if (pagingOptions != null) {
    baseQuery.Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value);
    baseQuery.Take(pagingOptions.Limit.Value);
}

2) добавление "OrderBy" ( WEB API IQueryable skip () take () )

    var query = await baseQuery
    .OrderBy(x => x.Id)
    .ProjectTo<EntityDto>(_mappingConfiguration)
    .ToListAsync();

    return query;

Помогаете ли вы в создании динамического разбиения на страницы из источника IQueryable?

1 Ответ

6 голосов
/ 04 июня 2019

Вы не обновляете свой запрос в случае нумерации страниц. Пропустить и Взять вернуть в результате новый IEnumerable вместо изменения существующего на месте.Таким образом, вы должны заменить эту строку:

baseQuery
   .Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value)
   .Take(pagingOptions.Limit.Value);

на:

baseQuery = baseQuery
   .Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value)
   .Take(pagingOptions.Limit.Value);

Таким образом, вы присваиваете новое значение запроса для baseQuery, а затем при его перечислении оновернет ожидаемые объекты.

...