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