Saltar al contenido

EF Core linq y conditional include y luego incluye el problema

Hola usuario de nuestra web, hemos encontrado la solución a tu búsqueda, deslízate y la hallarás a continuación.

Solución:

La técnica que está utilizando no es realmente una carga explícita (Include / ThenInclude), pero el truco se basa en la proyección y la corrección de la propiedad de navegación de 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.

La implementación de la inclusión condicional en el nivel de consulta raíz es relativamente fácil. Tenga en cuenta que el Include el método comienza desde (se define para) IQueryable y el devuelto IIncludableQueryable> es también IQueryable. Lo que significa que puedes mantener IQueryable consultar variable 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 If(
    this IQueryable source,
    bool condition,
    Func, IQueryable> transform
)
 
    return condition? transform(source) : source;

y usarlo 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 If(
    this IIncludableQueryable source,
    bool condition,
    Func, IQueryable> transform
)
    where T : class

    return condition ? transform(source) : source;


public static IQueryable If(
    this IIncludableQueryable> source,
    bool condition,
    Func>, IQueryable> transform
)
    where T : class

    return condition ? transform(source) : source;

que le permitirá utilizar 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))

Si sostienes alguna desconfianza o capacidad de acrecentar nuestro artículo eres capaz de dejar una glosa y con deseo lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *