跳过并无法使用IQueryable数据源

Pat*_*ick 1 c# entity-framework-core ef-core-2.2

我在服务层中名为“ 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);
}
Run Code Online (Sandbox Code Playgroud)

这将返回类型为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;
}
Run Code Online (Sandbox Code Playgroud)

但是,查询仍然返回整个集合。我的假设是GetBaseEntity()只是设置查询,但是执行应用于LoadResourcesMethod,在这里我在LoadResources方法中应用了ToListAsync()。

我尝试了以下方法,但是没有用:

1)不链接查询(带有实体框架的IQueryable-顺序,其中,跳过和采用无效

if (pagingOptions != null) {
    baseQuery.Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value);
    baseQuery.Take(pagingOptions.Limit.Value);
}
Run Code Online (Sandbox Code Playgroud)

2)添加“ OrderBy”(WEB API IQueryable skip()take()

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

    return query;
Run Code Online (Sandbox Code Playgroud)

从IQueryable来源建立动态分页有任何帮助吗?

Mar*_*pic 6

You are not updating your query in case of pagination. Skip and Take return a new IEnumerable as a result, instead of modifying the existing one in place. So, you should replace this line:

baseQuery
   .Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value)
   .Take(pagingOptions.Limit.Value);
Run Code Online (Sandbox Code Playgroud)

with:

baseQuery = baseQuery
   .Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value)
   .Take(pagingOptions.Limit.Value);
Run Code Online (Sandbox Code Playgroud)

This way, you assign the new query value to the baseQuery and then when you enumerate it, it will return the expected entities.