【问题标题】:A dynamic include action for a DbSet is not getting applied未应用 DbSet 的动态包含操作
【发布时间】:2021-07-19 20:42:53
【问题描述】:

我正在尝试在我的基础存储库中获取一种方法以允许动态包含。考虑以下我想要的直接版本:

public async Task<IList<Presentation>> All()
{
    return await DbSet
        .Include(x => x.Questions)
        .ToListAsync();
}

该函数按预期工作 - Questions 包含在结果中。

现在在基础存储库中考虑这个方法:

public virtual async Task<IPagedList<TEntity>> AllAsync(int? page, int? pageSize, Action<IQueryable<TEntity>> includeAction = null)
{
    var index = page ?? 1;
    var size = pageSize ?? 25;
    var skipRows = (index - 1) * size;

    var queryable = DbSet.Skip(skipRows).Take(size);
    includeAction?.Invoke(queryable);

    var items = await queryable.ToListAsync();
    return new PagedList<TEntity>(index, size, items);
}

我这样称呼它:

functionResult.Presentations = await presentationRepository.AllAsync(request.Page, null, set => set.Include(x => x.Questions));

从我的角度来看,我正在做同样的事情,但由于某种原因,Questions 不包含在该结果中。

注意:我尝试将.Skip(skipRows).Take(size) 移动到queryable 部分,这样Include 只适用于DbSet,就像这样,并且没有变化结果。

var items = await queryable.Skip(skipRows).Take(size).ToListAsync();

【问题讨论】:

    标签: c# .net .net-core entity-framework-core


    【解决方案1】:

    Include 返回一个新的可查询对象,因此它必须是 Func&lt;IQueryable&lt;TEntity&gt;, IQueryable&lt;TEntity&gt;&gt;,而不是 Action&lt;IQueryable&lt;TEntity&gt;&gt;。例如:

    public virtual async Task<IPagedList<TEntity>> AllAsync(int? page, int? pageSize, 
        Func<IQueryable<TEntity>, IQueryable<TEntity>> includeFunc = null)
    {
        var index = page ?? 1;
        var size = pageSize ?? 25;
        var skipRows = (index - 1) * size;
    
        var queryable = DbSet.Skip(skipRows).Take(size);
    
        if(includeFunc != null)
        {
            queryable = includeFunc(queryable);
        }
    
        var items = await queryable.ToListAsync();
        return new PagedList<TEntity>(index, size, items);
    }
    

    【讨论】:

    • 成功了,谢谢!我会尽快接受。
    • 旁注,这种方法有点危险,因为它让调用者几乎可以对可查询对象做任何事情,包括返回一个全新的对象。
    • 这是一个非常好的观察结果,我将与我的团队一起审查它,但我认为它的使用是独立且安全的,足以支持它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多