我在服务层中所有名为“ 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()只是设置查询,但执行适用于LoadResourcesMethod,在这里我在LoadResources方法中应用了ToListAsync()。
我尝试了以下方法,但没有用:
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来源构建动态分页的任何帮助吗?
答案 0 :(得分:6)
在分页的情况下,您不会更新查询。 Skip和Take会返回一个新的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
通过这种方式,您可以将新查询值分配给class C {
static find<T extends typeof C>(
this: T,
selector?: { [P in keyof InstanceType<T>]?: (InstanceType<T>)[P] } | C,
) {
if (!selector) {
selector = { id: 1 };
}
return Collection.find(selector);
}
id: number;
}
,然后在对它进行枚举时,它将返回预期的实体。