[英]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传递的IQueryable在ShopExpressions的StoreLite方法
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.