Aprendiendo a usar Dapper: throws Error de lanzamiento inválido

c# dapper

Pregunta

VS2013 c # forma de ventanas. Estoy aprendiendo Dapper y esta es mi primera oportunidad: tengo una clase simple:

 public class R
 {
     public int RID   { get; set; }
     public int RType { get; set; }
     public string CC { get; set; }
     public string RI { get; set; }
     .
     .
     .
}

    private void _setR(string rID)
    {            
        int r_ID = Convert.ToInt16(requestID);
        MY_R = new R();

        SqlConnection c = new SqlConnection(Connection string);
        c.Open();
        var v= c.Query<R>("select RID, RType, CC, RI, .,.,., " +
                                          "from Db_View_R where RID=@r_ID", 
                                          new { @r_ID = r_ID }) ;
        c.Close();            
        MY_R = (R)v ; <--------- Invalid cast error here
    }

La consulta es simple: algunas columnas de una vista. Devuelve solo 1 fila No estoy seguro de qué me estoy perdiendo aquí. Gracias por adelantado

Respuesta aceptada

Método de extensión Query<T> devuelve IEnumerable<T> . Por lo tanto, definitivamente no puede asignar el valor de tipo IEnumerable<T> a la variable de tipo T Deberías tomar solo un elemento de la secuencia:

MY_R = v.FirstOrDefault(); // or First, Single, SingleOrDefault

De hecho, con una mejor nomenclatura, su código debería verse así:

var sql = "SELECT RID, RType, CC, RI FROM Db_View_R where RID = @id";

using(var conn = new SqlConnection(ConnectionString))
{
     MY_R = conn.Query<R>(sql, new { id = Convert.ToInt16(requestID) })
                .FirstOrDefault();
}

Todavía no me gustan los nombres como R (probablemente debería ser Request ) pero ya es mucho más legible y seguro (debe ajustar el uso de la conexión en la instrucción using ).


Respuesta popular

use SingleOrDefault ()

var v= c.Query<R>("select RID, RType, CC, RI, .,.,., " +
                                          "from Db_View_R where RID=@r_ID", 
                                          new { @r_ID = r_ID }).SingleOrDefault();


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué