Общий рекурсивный «Включить» — EF

#.net #entity-framework #entity-framework-6 #.net-4.7.2

#.net #entity-framework #entity-framework-6 #.net-4.7.2

Вопрос:

Мне нужно выполнить рекурсивный вызов с включениями в базу данных (EF 6.2.0), возможно ли это сделать общим способом?

 public class Option
{
    public long OptionID { get; set; }

    public long Property1 { get; set; }

    public long Property2 { get; set; }

    public long Property3 { get; set; }

    public long Property4 { get; set; }
}

public class ClassOne
{
    public long OrderID { get; set; }

    public long OptionID { get; set; }

    public long Property1 { get; set; }

    public long Property2 { get; set; }

    public long Property3 { get; set; }

    public long Property4 { get; set; }

    public virtual Option Option { get; set; }

    public virtual ICollection<ClassOne> CollectionOne { get; set; } = new HashSet<ClassOne>();

    public virtual ICollection<ClassTwo> CollectionTwo { get; set; } = new HashSet<ClassTwo>();
}

    public ICollection<TEntity> Find(Expression<Func<TEntity, bool>> currentExpression, IncludeProperties includeProperties)
    {
        using (var currentContext = new TContext())
        {
            return (includeProperties == IncludeProperties.None
                    ? new List<Expression<Func<TEntity, object>>>()
                    : PropertyInfoToExpression(GetVirtualProperties(new TEntity())))
                .Aggregate(currentContext.Set<TEntity>().AsQueryable(),
                    (x, includeProperty) => x.Include(includeProperty)).Where(currentExpression).ToList();
        }
    }

_classOneRepository.Find(x => x.Property1 == 1), IncludeProperties.All);
  

С помощью этого кода я получаю все коллекции родительского элемента, но я не могу получить данные коллекций их дочерних элементов.

Ответ №1:

Мне нужно выполнить рекурсивный вызов с включениями в базу данных (EF 6.2.0), возможно ли это

Просто невозможно. Быстрая загрузка с использованием «include» генерирует один большой запрос для извлечения всех связанных объектов, и EF не имеет возможности выразить рекурсивный запрос с использованием выражения .NET или сгенерировать его в SQL.

Либо выполните рекурсию по результатам и, используя явную загрузку или отложенную загрузку, извлеките уровни дочерних элементов, либо загрузите все объекты и позвольте трекеру изменений «исправить» свойства навигации. Если ваш сервер поддерживает рекурсивные запросы, вы могли бы написать запрос хранилища для извлечения дерева сущностей, чтобы средство отслеживания изменений могло объединяться.