繁体   English   中英

在实体框架核心的同一DbSet上合并两个IIncludedQueryable

[英]combine two IIncludedQueryable on same DbSet in Entity Framework Core

我想将IIncludedQueryable对象添加到现有的IIncludedQueryable对象。

我的一些对象继承了IClientAccess,并且我希望包括相关实体,而不必为每个实体更改IQueryable代码。

我的代码

public static IQueryable<IStore> StoreLite(IQueryable<IStore> dbSet)
{
    var result = dbSet
        .Include(str => str.VATs)
            .ThenInclude(vat => vat.VAT)
                .ThenInclude(vat => vat.Culture)
                    .ThenInclude(cult => cult.Items)
                        .ThenInclude(itm => itm.Culture)
        .Include(str => str.Options)
            .ThenInclude(opt => opt.Items)
                .ThenInclude(itm => itm.Option)
        .Include(str => str.Cultures)
            .ThenInclude(cult => cult.Items)
                .ThenInclude(itm => itm.Culture)
                    .ThenInclude(cult => cult.Items)
                        .ThenInclude(itm => itm.Culture)
        .Include(str => str.Pages)
            .ThenInclude(page => page.Sections)
                .ThenInclude(section => section.Elements);

    return result;
}

public static IQueryable<IClientAccess> ClientAccess(IQueryable<IClientAccess> dbSet)
{
    var result = dbSet
        .Include(clnt => clnt.ClientAccess)
            .ThenInclude(acc => acc.Items)
                .ThenInclude(itm => itm.Client);

    return result;
}

所以我在StoreLite中的想法是:

var result = dbSet...(existing);

result += ClientAccess(dbSet); //I know this don't work

我的解决方案是从CLIENTACCESS传递的IQueryableShopExpressionsStoreLite方法

GenericExpressions.cs

public static IQueryable<T> ClientAccess<T>(IQueryable<T> dbSet) where T : class, IBaseData, IClientAccess
{
    var result = dbSet
        .Include(clnt => clnt.ClientAccess)
            .ThenInclude(acc => acc.Items)
                .ThenInclude(itm => itm.Client);

    return result;
}

ShopExpressions.cs

public static IQueryable<IStore> StoreLite(IQueryable<IStore> dbSet)
{
    var result = dbSet
        .Include(str => str.VATs)
            .ThenInclude(vat => vat.VAT)
                .ThenInclude(vat => vat.Culture)
                    .ThenInclude(cult => cult.Items)
                        .ThenInclude(itm => itm.Culture)
        .Include(str => str.Options)
            .ThenInclude(opt => opt.Items)
                .ThenInclude(itm => itm.Option)
        .Include(str => str.Cultures)
            .ThenInclude(cult => cult.Items)
                .ThenInclude(itm => itm.Culture)
                    .ThenInclude(cult => cult.Items)
                        .ThenInclude(itm => itm.Culture)
        .Include(str => str.Pages)
            .ThenInclude(page => page.Sections)
                .ThenInclude(section => section.Elements);

    return result;
}

使用中

public async Task<IStore> GetStoreLite(int id)
{
    IStore result = await ShopExpressions.StoreLite(GenericExpressions.ClientAccess(this.Worker.GetRepo<Store>().DbSet))
        .SingleAsync(str => str.Id.Equals(id));

    this.Worker.ValidateClientAccess(result);

    return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM