Saltar al contenido

Usando Dapper QueryAsync para devolver un solo objeto

Indagamos por todo el mundo on line y así de esta forma mostrarte la solución a tu duda, si continúas con dudas deja tu inquietud y respondemos porque estamos para ayudarte.

Solución:

En primer lugar, no creo que necesites el null check, Dapper devolverá la fila cero para una consulta. TENGA EN CUENTA que esto es CIERTO por SQL Serverpero debe ser el mismo para cualquier otro RDBMS. Así que esto

return schemePolicy != null ? schemePolicy.FirstOrDefault() : null;

puede escribirse simplemente como

return schemePolicy.FirstOrDefault();

Ahora para abordar la preocupación real, y usted mencionó:

el objeto regresa fuera de la llamada asíncrona

trueEso no es . Si lo escribes de cualquier manera lo harás SOLAMENTE

var schemePolicy = await sql.QueryAsync("sp", rest of code);
return schemePolicy.FirstOrDefault();

obtenga su objeto después de que se haya ejecutado la consulta. Entonces, los siguientes dos conjuntos de códigos producirán el mismo comportamiento:

var schemePolicy = sql.QueryAsync("sp", rest of code);
return schemePolicy.Result.FirstOrDefault();

y GetById La preocupación realmente ahora es la forma en que llamas para asegurarse de que (1) el método no bloqueará ningún otro hilo y (2) que obtendrás tu objeto objetivo

static async void GetValue()

    var repo = new SchemePolicyRepository(new DbManager()); // creates an open connection 
    var result = await repo.GetById();
    Console.WriteLine(result);


static void Main(string[] args)

    GetValue();   
    Console.WriteLine("Query is running...");
    Console.ReadKey();

SOLO cuando la consulta ha terminado de ejecutarse. Aquí hay un fragmento de una aplicación de consola con la que puede probarla: GetValue Esa prueba te mostrará que GetById que en consecuencia llama a la FirstOrDefault El método no bloquea el resto del código. Además, que nada se devuelve de

hasta que la consulta haya sido procesada.

public async Task GetById()

    var sql = @"
WAITFOR DELAY '00:00:05';
select 1 where 1=1";

    var result = await the_open_connection.QueryAsync(sql);    
    return result.FirstOrDefault();

Aquí está el código de soporte para la consulta en caso de que alguien quiera probar y verificar que el concepto es válido (el código funciona con SQL Server 2008 y versiones posteriores): QueryFirstOrDefaultAsync() Soportes elegantes

public async Task GetById(string id)

    return await sql.QueryFirstOrDefaultAsync("risk.iE_GetSchemePolicyById",
        new  Id = id ,
        commandType: CommandType.StoredProcedure);

hoy en día, por lo que podría escribir el código de esta manera,

Sección de Reseñas y Valoraciones

Recuerda que tienes la opción de decir si te fue preciso.

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