使用实体框架和 ASP.NET,我可以使用
IRepository.GetAll().Include()
轻松预加载整个实体列表。
是否还有一种简单快捷的方法来预加载单个实体,例如 IRepository.Get().Include()
?
比如我现在正在写
var mi = _miRepository.GetAll().Include(m => m.Type).Where(m => m.Id == input.Id).First();
虽然我觉得获取全部然后用Where和First进行过滤是多余和丑陋的。这样看起来会干净很多:
var mi = _miRepository.Get().Include(m => m.Type);
如果您的存储库模式使用类似以下内容:
IQueryable<TEntity> GetAll();
// and
TEntity Get(int id);
然后您可以更改 Get() 方法以返回
IQueryable
:
IQueryable<TEntity> Get(int id);
内容需要更改为:
return _context.DbSet<TEntity>().Find(id);
至:
return _context.DbSet<TEntity>().Where(x => x.Id == id);
这意味着任何期望单个实体返回的现有调用都需要从以下位置更新:
var entity = repository.Get(id);
至:
var entity = repository.Get(id).Single();
虽然对于打算返回单个对象的方法使用
IQueryable
似乎违反直觉,但这确实使调用者能够灵活地利用投影 (.Select()
) 以及控制您可能想要渴望的相关细节加载,或者简单地进行存在检查(.Any()
),而不实际将实体加载到内存中。