cómo devolver un valor de enterger por objeto de consulta utilizando dapper

c# dapper

Pregunta

Con el siguiente método estoy tratando de devolver un intger que es devuelto por un procedimiento almacenado, devuelve un valor de 0 o más de cero. Según tengo entendido, cuando los datos sean devueltos, será un diccionario (no estoy seguro) mientras trato de devolver un número entero. Cómo puedo lograr eso. El código siguiente está incompleto y el código en el comentario es lo que hice al principio y me di cuenta de que puedo reescribir el mismo código de una manera muy simple. Los dejé a los dos allí, así que estoy equivocado, alguien puede arreglarme gracias.

public int Exists(string plan)
{
    using (var connection = new SqlConnection(Connection))
    {
        connection.Open();
       var parameters = new DynamicParameters();
       //parameters.Add("@Plan", plan, DbType.String,
           //ParameterDirection.Input, null);
           //I guess I can directly pass param but not sure how ??

        var data=connection.Query("storeProcmem_Plan", new{ ? ?},
               CommandType.StoredProcedure);

        //how to return an integer               
        int myvalue= data ???                


        connection.Close();
        return Convert.ToInt32(data);

Respuesta experta

Suponiendo que sus parámetros son fijos (que típicamente son para procedimientos almacenados), el tiempo principal en el que necesitaría DynamicParameters es si está generando SQL on-the = fly para que coincida con alguna consulta flexible compleja), entonces el aspecto del parámetro es tan simple como:

new { Plan = plan }

Esto utiliza la característica de tipo anónimo del compilador para definir que el parámetro debe llamarse Plan , ser de tipo string y tener el valor tomado del plan variable.

Si suponemos que el procedimiento almacenado select el resultado (en lugar de return , que debe codificarse por separado) en una sola fila, la forma más fácil de leer es:

var myvalue = connection.Query<int>("storeProcmem_Plan", new { Plan = plan },
           CommandType.StoredProcedure).First();

La API genérica vs no genérica cambia entre resultados tipados y dynamic ; ambos tienen usos, pero <int> parece apropiado aquí. .First() es la operación LINQ estándar que se traduce de IEnumerable<T> a T seleccionando el primer valor (y lanzando una excepción si no había uno); también podría usar Single() , FirstOrDefault() o SingleOrDefault() según la semántica exacta que desee.

Para completar, si estaba usando la API no genérica, entonces necesita saber el nombre de la columna , básicamente, eso sería:

dynamic row = connection.Query("storeProcmem_Plan", new { Plan = plan },
       CommandType.StoredProcedure).First();
int myvalue = row.ColumnName;


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow