首页 > 解决方案 > 将 IIncludableQueryable 对象传递给实体框架核心中的 DbSet

问题描述

如何将类型的对象传递IIncludableQueryableDbSet<>对象? IQueryabletype 有效,但IIncludableQueryable在使用Includeand时无效ThenInclude

测试方法应该接受一个链接IIncludableQueryable元素 ( .Include().ThenInclude())。

测试

public IQueryable<TEntity> Test<TEntity>(DbSet<TEntity> dbSet, Expression<Func<IIncludableQueryable<TEntity, object>>> query) where TEntity : class => dbSet.Include(query);

调用者示例

return Test<Site>(dbSet, .ThenInclude(app => app.Client)
            .ThenInclude(cl => cl.Country)
                .ThenInclude(co => co.Culture)
    .Include(st => st.App)
        .ThenInclude(app => app.ServiceType)
    .Include(st => st.CORSEntries)
    .Include(st => st.DataConnection)
    .Include(st => st.Features)
        .ThenInclude(ft => ft.Cultures)
            .ThenInclude(clt => clt.Culture)
    .Include(st => st.MetaEntries)
        .ThenInclude(mt => mt.Culture)
    .Include(st => st.Views)
        .ThenInclude(vw => vw.MetaEntries)
            .ThenInclude(mt => mt.Culture));

标签: c#entity-framework-core

解决方案


经过一番阅读,我找到了解决方案。

public async Task<IQueryable<ISite>> Site(Expression<Func<Site, bool>> predicate)
{
    var query = this.DbSet.Include(st => st.App)
            .ThenInclude(app => app.Client)
                .ThenInclude(cl => cl.Country)
                    .ThenInclude(co => co.Culture)
        .Include(st => st.App)
            .ThenInclude(app => app.ServiceType)
        .Include(st => st.CORSEntries)
        .Include(st => st.DataConnection)
        .Include(st => st.Features)
            .ThenInclude(ft => ft.Cultures)
                .ThenInclude(clt => clt.Culture)
        .Include(st => st.MetaEntries)
            .ThenInclude(mt => mt.Culture)
        .Include(st => st.Views)
            .ThenInclude(vw => vw.MetaEntries)
                .ThenInclude(mt => mt.Culture)
        .Where(predicate);

    return await Exec(query);
}

基地

protected async Task<IQueryable<TImplementation>> Exec(IQueryable<TImplementation> query)
{
    return await query.ToQueryableAsync();
}

ToQueryableAsync扩展:

public static async Task<IQueryable<TSource>> ToQueryableAsync<TSource>(this IQueryable<TSource> source) where TSource : IAssetsBase
{
    var result = await source.ToListAsync();

    return result.AsQueryable();
}

推荐阅读