Solución:
La técnica que está utilizando no es una carga realmente explícita (Include
/ ThenInclude
), pero el truco se basa en la proyección y la reparación de la propiedad de navegación EF Core, por lo que no puedo decir por qué deja de funcionar. EF Core aún procesa proyecciones e incluye de manera diferente, por lo que podría ser un defecto en el procesamiento actual.
Implementar la inclusión condicional en el nivel de la consulta raíz es relativamente fácil. Tenga en cuenta que el Include
el método comienza desde (está definido para) IQueryable<TEntity>
y el devuelto IIncludableQueryable<TEntity, TPreviousProperty>>
es también IQueryable<TEntity>
. Lo que significa que puedes quedarte IQueryable<T>
variable de consulta y aplicar transformaciones condicionales similares a encadenadas Where
operadores.
Para hacerlo más fácil, puede crear un método de extensión auxiliar personalizado como este:
public static IQueryable<T> If<T>(
this IQueryable<T> source,
bool condition,
Func<IQueryable<T>, IQueryable<T>> transform
)
{
return condition? transform(source) : source;
}
y utilícelo así:
_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))
Si necesita algo similar para los niveles anidados (ThenInclude
), luego agregue los siguientes 2 métodos de extensión:
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;
}
que te permitirá usar algo como esto:
_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))