【发布时间】:2019-10-20 04:55:26
【问题描述】:
我的服务层中的所有对象都有一个通用方法,名为“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);
}
这将返回一个 TEntity 类型的 IQueryable。我想在方法中动态传递分页选项,所以我以这种方式实现它:
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() 只是设置了查询,但执行适用于我在 LoadResources 方法中应用 ToListAsync() 的 LoadResourcesMethod。
我尝试了以下方法,但没有成功:
1) 不链接查询 (IQueryable with Entity Framework - order, where, skip and take have no effect)
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 源构建动态分页有任何帮助吗?
【问题讨论】:
-
调用
Skip和Take除了返回修改后的查询,您不会在任何地方捕获。
标签: c# entity-framework-core ef-core-2.2