Saltar al contenido

FindAsync e incluir sentencias LINQ

Hola usuario de nuestra página, encontramos la respuesta a lo que necesitas, desplázate y la verás más abajo.

Solución:

Lo más sencillo es usar FirstOrDefaultAsync o SingleOrDefaultAsync en lugar de:

model.Item = await db.Items.Include(i => i.ItemVerifications)
    .FirstOrDefaultAsync(i => i.Id == id.Value);

La razón por la que está recibiendo el error es porque Find / FindAsync se definen métodos para DbSet, pero el resultado de Include es IQueryable.

Otra forma es combinar FindAsync con carga explícita:

model.Item = await db.Items.FindAsync(id);
if (model.Item == null)

    return HttpNotFound();

await db.Entry(model.Item).Collection(i => i.ItemVerifications).LoadAsync();    

Si está utilizando un repositorio genérico y no conoce el PK en tiempo de ejecución, este enfoque puede ayudar:

public interface IGenericRepository where TEntity : class

    Task Get(int id, string[] paths = null);


public class GenericRepository : IGenericRepository where TEntity : class

    private readonly ApplicationDbContext _context;
    private readonly DbSet _dbSet;

    public GenericRepository(ApplicationDbContext context)
    
        _context = context;
        _dbSet = _context.Set();
    

    public async Task Get(int id, string[] paths = null)
    
        var model = await _dbSet.FindAsync(id);
        foreach (var path in paths)
        
            _context.Entry(model).Reference(path).Load();
        
        return model;
    

Cuando programe utilizando principios sólidos y diseño de dominio, utilice genéricos. El patrón Repository usa una clase genérica. Paso un lambda express a la función GetObjectsQueryable. He configurado la carga diferida para que esté activada, usando las primeras barras de control del código. Sin embargo, me estoy alejando de la carga diferida e implementando una arquitectura de microservicio. La tabla de inclusión es una string y puede usar la función nameof (xxclass) para garantizar el nombre correcto. La función devuelve y los resultados de IQueryable. Los métodos de la clase del repositorio pueden ser utilizados por su mejora de la clase derivada, el método está protegido. Esta es una demostración de dotnet.core.

public class Repository
    where T : class

    public IQueryable GetObjectsQueryable(Expression> predicate, string includeTable="")
    
        IQueryable result = _dbContext.Set().Where(predicate);
        if (includeTable != "")
            result = result.Include(includeTable);

        return result;
    

Si para ti ha sido de ayuda este post, agradeceríamos que lo compartas con más desarrolladores de este modo nos ayudas a extender nuestra información.

¡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 *