急切加载单个实体

问题描述 投票:0回答:1

使用实体框架和 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);
c# linq entity-framework-core include irepository
1个回答
0
投票

如果您的存储库模式使用类似以下内容:

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()
),而不实际将实体加载到内存中。

© www.soinside.com 2019 - 2024. All rights reserved.