Техника, которую вы используете, это не просто явная загрузка (Include
/ ThenInclude
), а уловка, основанная на проекции и исправлении свойства навигации EF Core, поэтому я не могу сказать, почему она перестает работать.EF Core по-прежнему обрабатывает проекции и включает по-разному, поэтому это может быть дефект в текущей обработке.
Реализация условного включения на уровне корневого запроса относительно проста.Обратите внимание, что метод Include
начинается с (определено для) IQueryable<TEntity>
, а возвращаемый IIncludableQueryable<TEntity, TPreviousProperty>>
также равен IQueryable<TEntity>
.Это означает, что вы можете хранить IQueryable<T>
переменную запроса и применять условные преобразования, аналогичные цепочечным Where
операторам.
Чтобы упростить это, вы можете создать собственный вспомогательный метод расширения, подобный этому:
public static IQueryable<T> If<T>(
this IQueryable<T> source,
bool condition,
Func<IQueryable<T>, IQueryable<T>> transform
)
{
return condition? transform(source) : source;
}
и используйте его следующим образом:
_context.Investors.Where(s => s.Id == userId)
.If(flagCoins, q => q.Include(e => e.Coins)
.ThenInclude(e => e.CoinType))
.If(flagBricks, q => q.Include(e => e.Bricks))
Если вам нужно нечто подобное для вложенных уровней (ThenInclude
), добавьте следующие 2 метода расширения:
public static IQueryable<T> If<T, P>(
this IIncludableQueryable<T, P> source,
bool condition,
Func<IIncludableQueryable<T, P>, IQueryable<T>> transform
)
where T : class
{
return condition ? transform(source) : source;
}
public static IQueryable<T> If<T, P>(
this IIncludableQueryable<T, IEnumerable<P>> source,
bool condition,
Func<IIncludableQueryable<T, IEnumerable<P>>, IQueryable<T>> transform
)
where T : class
{
return condition ? transform(source) : source;
}
что позволит вам использовать что-то вроде этого:
_context.Investors.Where(s => s.Id == userId)
.If(flagCoins, q => q.Include(e => e.Coins)
.If(flagCoinType, q2 => q2.ThenInclude(e => e.CoinType)))
.If(flagBricks, q => q.Include(e => e.Bricks))