跳过并无法使用IQueryable数据源

时间:2019-06-04 16:11:23

标签: 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);
}

这将返回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来源构建动态分页的任何帮助吗?

1 个答案:

答案 0 :(得分:6)

在分页的情况下,您不会更新查询。 SkipTake会返回一个新的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; } ,然后在对它进行枚举时,它将返回预期的实体。