Include зависимых сущностей в EF
Допустим, контекст у меня спрятан за интерфейсом и я через метод Get(int id) получаю объект интересующей меня сущности.
Проблема в том, что есть сущности, которые имеют навигационные свойства и мне иногда они нужны, а иногда не нужны => нет причин, что бы EF делал лишние запросы и нагружал БД.
Можно ли как-то изящно параметаризировать этот момент, что бы я мог сказать, что нужно или не нужно мне грузить те или иные навигационные свойства?
Ответы (1 шт):
Автор решения: xxramm
→ Ссылка
Есть следующие варианты решения. Допустим у нас есть интерфейс, который дает доступ к репозиторию.
public interface MyRepositoryInterface
{
// Получаем связанные сущности Entity1 и Entity2
Task<Entity1> GetMultiplyEntities();
// Получаем только Entity1.
Task<Entity1> GetOnlyOneEntity();
// Получаем связь по условию.
Task<DtoObject> GetLinkEntityByCondition(bool bind);
}
Реализация:
public classMyRepository : MyRepositoryInterface
{
// Тут инжект контекста еще. (_db)
public async Task<Entity1> GetMultiplyEntities()
{
var dataQuery = _db.Entity1.Include(x => x.Entity2);
var data = await dataQuery.FirstOrDefaultAsync();
return data;
}
public async Task<Entity1> GetOnlyOneEntity(){
var dataQuery = _db.Entity1;
var data = await dataQuery.FirstOrDefaultAsync();
return data;
}
public async Task<DtoObject> GetLinkEntityByCondition(bool bind){
var dataQuery = from e1 in _db.Entity1
join e2 in _db.Entity2 on new { bind, e1.ID }
equals { true, e2.Entity1ID}
select new DtoObject {
//... выбираем что-то
};
var data = await dataQuery.FirstOrDefaultAsync();
return data;
}
}
Подводя итог:
- GetMultiplyEntities - получаем сразу связанные объекты.
- GetOnlyOneEntity - получаем только один объект
- GetLinkEntityByCondition - получаем объекты по условию и проецируем их в DtoObject.