Casting IEnumerable con classe personalizzata

c# casting dapper ienumerable

Domanda

Ultimamente sto usando dapper e volevo creare un metodo dinamico che rendesse più semplice la selezione di cose con sql. Questo è il mio codice:

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

    }
}

Chiamata funzione qui:

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

Mi dà un errore that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts .

Come posso lanciarlo per farlo funzionare.

Risposta accettata

Tecnicamente è possibile utilizzare semplicemente IEnumerable.Cast -method per eseguire il cast di ogni istanza restituita dal metodo sull'istanza effettiva.

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

Tuttavia se conosci già il tipo effettivo perché non utilizzarlo già nella query? dynamic dovrebbe essere gestita con cura e solo se davvero dynamic devi, cosa di cui dubito sia il caso qui. Ad esempio, potresti aggiungere il tipo effettivo come parametro del tipo al metodo:

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

Ora puoi chiamarlo come segue:

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

Come un Method parte è un nome di classe davvero male, come anche i posts . Dovresti dare i nomi delle tue classi che descrivono ciò per cui servono e quello che stanno facendo. Inoltre ci sono convenzioni di denominazione che suggeriscono di usare PascalCase per la classe che crea i tuoi Posts classe. Finalmente quando hai un'enumerazione di posts , suppongo che la classe stessa rappresenti un singolo post, non molti, quindi vuoi effettivamente una classe di nome Post che puoi memorizzare in un oggetto IEnumerable<Post> .



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché