Skip and Take 不适用于 IQueryable 数据源
Skip and Take not working for an IQueryable datasource
我的服务层中有一个跨所有对象的通用方法,名为 "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);
}
此 returns 类型为 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;
}
不过,查询还是returns全集。我的假设是 GetBaseEntity() 只是设置了查询,但执行适用于 LoadResourcesMethod,我在 LoadResources 方法中应用了 ToListAsync()。
我尝试了以下但没有用:
1) 没有链接查询 ()
if (pagingOptions != null) {
baseQuery.Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value);
baseQuery.Take(pagingOptions.Limit.Value);
}
2) 添加一个 "OrderBy"
()
var query = await baseQuery
.OrderBy(x => x.Id)
.ProjectTo<EntityDto>(_mappingConfiguration)
.ToListAsync();
return query;
对于从 IQueryable 源构建动态分页有任何帮助吗?
您没有在分页的情况下更新您的查询。结果 Skip and Take return 一个新的 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
,然后当您枚举它时,它将 return 预期的实体。
我的服务层中有一个跨所有对象的通用方法,名为 "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);
}
此 returns 类型为 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;
}
不过,查询还是returns全集。我的假设是 GetBaseEntity() 只是设置了查询,但执行适用于 LoadResourcesMethod,我在 LoadResources 方法中应用了 ToListAsync()。
我尝试了以下但没有用:
1) 没有链接查询 (
if (pagingOptions != null) {
baseQuery.Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value);
baseQuery.Take(pagingOptions.Limit.Value);
}
2) 添加一个 "OrderBy"
(
var query = await baseQuery
.OrderBy(x => x.Id)
.ProjectTo<EntityDto>(_mappingConfiguration)
.ToListAsync();
return query;
对于从 IQueryable 源构建动态分页有任何帮助吗?
您没有在分页的情况下更新您的查询。结果 Skip and Take return 一个新的 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
,然后当您枚举它时,它将 return 预期的实体。