Apprendre à utiliser Dapper: jette une erreur de distribution invalide

c# dapper

Question

Formulaire VS2013 c # windows. J'apprends Dapper et c'est mon premier coup: j'ai un cours 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 requête est simple: quelques colonnes d'une vue. Renvoie seulement 1 ligne. Je ne sais pas ce qui me manque ici. Merci d'avance

Réponse acceptée

Méthode d'extension Query<T> renvoie IEnumerable<T> . Vous ne pouvez donc certainement pas attribuer une valeur de type IEnumerable<T> à la variable de type T Vous ne devez prendre qu'un seul élément de la séquence:

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

En fait, avec un nom amélioré, votre code devrait ressembler à ceci:

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();
}

Je n'aime toujours pas les noms comme R (il devrait probablement s'agir de Request ) mais c'est déjà beaucoup plus lisible et sûr (vous devez envelopper l'utilisation de la connexion en using statement).


Réponse populaire

utilisez 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();



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi