![](/img/trans.png)
[英]pass IIncludableQueryable object to a DbSet in entity framework core
[英]is it possible to pass a IIncludableQueryable object and apply it to a DbSet
我想將查詢部分與視圖 function 分開,並將其作為 object 傳遞。
當前:
public async Task<IEnumerable<TType>> View<TType, TImplementation>(Expression<Func<TImplementation, bool>> predicate) where TType : IView
where TImplementation : View
{
var result = await this.DBContext.GetWorker<TImplementation>().DbSet
.Include(vw => vw.Site)
.ThenInclude(st => st.App)
.ThenInclude(ap => ap.Client)
.Include(vw => vw.Site)
.ThenInclude(st => st.CORSEntries)
.Include(vw => vw.Site)
.ThenInclude(st => st.MetaEntries)
.Where(predicate).ToListAsync();
return (IEnumerable<TType>)result;
}
我在找什么:
public async Task<TImplementation> ViewSingle<TImplementation>(Expression<Func<TImplementation, bool>> predicate, IIncludableQueryable<TImplementation> query) where TImplementation : View
{
var result = await this.DBContext.GetWorker<TImplementation>().DbSet
?? query ??
.SingleAsync(predicate);
return result;
}
語法是什么?
因此,我最終將獲得 DbSet 的部分移動到基礎 class 中的 function 中,它基本上完成了相同的工作並減少了多次編寫相同代碼的需要。
基地:
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;
}
繼承 ExpressionBase :
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.