[英]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.