2016-11-26 1 views
3

J'ai récemment utilisé dapper et je voulais créer une méthode dynamique qui faciliterait la sélection des objets avec sql. Voici mon code:Coulée IEnumerable <dynamic> avec la classe personnalisée

Classe:

public class Method 
{ 
    public static IEnumerable<dynamic> QueryAll(string table) 
    { 
     dynamic dyn = table; 
     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DbCon"].ToString()); 
     using (con) 
     { 
      string sql = String.Format("SELECT * FROM {0}", table); 
      IEnumerable<dynamic> ie = con.Query<dynamic>(sql, null); 
      return ie; 
     } 

    } 
} 

fonction d'appel ici:

IEnumerable<posts> = Method.QueryAll("posts"); 

Il me donne une erreur that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts.

Comment puis-je le lancer pour le faire fonctionner.

Répondre

5

Techniquement, vous pouvez simplement utiliser le IEnumerable.Cast -method pour convertir chaque instance renvoyée par la méthode en instance réelle.

IEnumerable<posts> = Method.QueryAll("posts").Cast<posts>(); 

Toutefois, si vous connaissez allready le type réel pourquoi ne pas l'utiliser dans la requête allready? dynamic devrait être manipulé avec soin et seulement si vous avez vraiment à, ce qui je doute est le cas ici. Vous pouvez par exemple ajouter le type réel de type paramètre à la méthode:

public static IEnumerable<T> QueryAll<T>(string table) 
{ 
    SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DbCon"].ToString()); 
    using (con) 
    { 
     string sql = String.Format("SELECT * FROM {0}", table); 
     IEnumerable<T> ie = con.Query<T>(sql, null); 
     return ie; 
    } 
} 

Maintenant, vous pouvez l'appeler comme suit:

var result = Method.QueryAll<posts>("posts"); 

En aparté Method est un nom de classe vraiment mauvais, comme posts aussi. Vous devriez donner vos noms de classe qui décrivent ce qu'ils servent et ce qu'ils font. De plus, il existe des conventions de nommage suggérant d'utiliser PascalCase -names pour classer votre classe Posts. Enfin, quand vous avez une énumération de posts, je suppose que la classe elle-même représente un seul poste, pas beaucoup, donc vous voulez une classe nommée Post que vous pouvez stocker dans un IEnumerable<Post>.

+0

Merci pour votre réponse rapide. Votre solution m'épanouit, je n'ai pas pensé à utiliser IEnumerable T. A propos des noms de classe, c'était seulement pour ce cas d'exemple mais oui, je pourrais essayer un peu plus difficile avec les choix de noms. – Harugawa