Fundir IEnumerable con clase personalizada

c# casting dapper ienumerable

Pregunta

Últimamente uso dapper y quería crear un método dinámico que facilitara la tarea de seleccionar cosas con sql. Este es mi código:

Clase:

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

    }
}

Llamando a la función aquí:

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

Me da un error that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts .

¿Cómo puedo lanzarlo para que funcione?

Respuesta aceptada

Técnicamente, podrías usar IEnumerable.Cast para convertir cada instancia devuelta desde el método a la instancia real.

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

Sin embargo, si ya conoce el tipo real, ¿por qué no utilizarlo en la consulta ya lista? dynamic debe manejarse con cuidado y solo si es realmente necesario, lo que dudo que sea el caso aquí. Por ejemplo, podría agregar el tipo real como parámetro-tipo al método:

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

Ahora puede llamarlo de la siguiente manera:

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

Como Method aparte Method es un nombre de clase realmente malo, como también posts . Debes dar los nombres de tus clases que describen para qué sirven y qué están haciendo. Además, hay nombres-convenciones que sugieren utilizar PascalCase -Nombres para la clase de hacer sus clases Posts . Por fin, cuando usted tiene una enumeración de posts , supongo que la propia clase representa un solo puesto, no muchos, por lo que desea real de una clase llamada Post que se puede almacenar en un IEnumerable<Post> .



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é