У меня есть общий метод для всех объектов в слое моего сервиса с именем «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?