【问题标题】:Skip and Take not working for an IQueryable datasourceSkip and Take 不适用于 IQueryable 数据源
【发布时间】: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 源构建动态分页有任何帮助吗?

【问题讨论】:

  • 调用 SkipTake 除了返回修改后的查询,您不会在任何地方捕获。

标签: c# entity-framework-core ef-core-2.2


【解决方案1】:

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

【讨论】:

  • 哦,我认为链接足以通过引用更新基本查询。您的解决方案奏效了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多