Includes
член вышеупомянутого ISpecification<T>
объявлен как
List<Expression<Func<T, object>>> Includes { get; }
Проблема в том, что цепочка EF Core Include
/ ThenInclude
не может быть представлена с Expression<Func<T, object>>
. Этот шаблон использовался в EF6, который поддерживал специальный синтаксис (Select
) внутри выражения include для разрешения элемента коллекции. Но EF Core не поддерживает это из коробки.
Самый простой и естественный способ подключить шаблон EF Core - это изменить определение следующим образом:
List<Func<IQueryable<T>, IIncludableQueryable<T, object>>> Includes { get; }
Добавление образца для сущность, имеющая свойство User
, имеющее коллекцию UserRoles
, имеющую свойство Role
, будет выглядеть следующим образом:
Includes.Add(q => q.Include(e => e.User).ThenInclude(e => e.UserRoles).ThenInclude(e => e.Role));
И соответствующая часть реализации метода Specify
будет иметь вид:
var queryableResultWithIncludes = spec.Includes
.Aggregate(query,
(current, include) => include(current));