Так что в итоге я переместил часть, в которой вместо этого получаю DbSet, в функцию базового класса, и она в основном выполняет ту же работу и избавляет от необходимости писать один и тот же код несколько раз.
База :
public abstract class ExpressionBase
{
private readonly IAssetsDBContextAccessor _db;
public ExpressionBase(IAssetsDBContextAccessor db)
{
_db = db;
}
internal IQueryable<TType> Exec<TType, TIplementation>(Expression<Func<TIplementation, bool>> predicate) where TType : IAssetsBase
where TIplementation : AssetsBase
{
var result = this.DBContext.GetWorker<TIplementation>().DbSet
.Where(predicate);
return (IQueryable<TType>)result;
}
internal IAssetsDBContextAccessor DBContext => _db;
}
База Inhereting Expression :
public class SitesExpressions : ExpressionBase
{
public SitesExpressionsBeta(IAssetsDBContextAccessor db) : base(db) { }
public async Task<IQueryable<ISite>> Site(Expression<Func<Site, bool>> predicate)
{
var result = await this.Exec<ISite, Site>(predicate)
.Include(st => st.App)
.ThenInclude(app => app.Client)
.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)
.ToListAsync();
return (IQueryable<ISite>)result;
}
public async Task<IQueryable<IView>> View(Expression<Func<View, bool>> predicate)
{
var result = await this.Exec<IView, View>(predicate)
.Include(vw => vw.MetaEntries)
.ThenInclude(mt => mt.Culture)
.ToListAsync();
return (IQueryable<IView>)result;
}
}