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;
    }

}

Подводя итог:

  1. GetMultiplyEntities - получаем сразу связанные объекты.
  2. GetOnlyOneEntity - получаем только один объект
  3. GetLinkEntityByCondition - получаем объекты по условию и проецируем их в DtoObject.
→ Ссылка