Casting IEnumerable mit benutzerdefinierter Klasse

c# casting dapper ienumerable

Frage

Ich benutze dapper in letzter Zeit und wollte eine dynamische Methode erstellen, die es einfacher macht, Dinge mit sql auszuwählen. Das ist mein Code:

Klasse:

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

    }
}

Funktion hier aufrufen:

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

Es gibt mir einen Fehler, that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts .

Wie kann ich es umwandeln, damit es funktioniert?

Akzeptierte Antwort

Technisch könnten Sie einfach die IEnumerable.Cast , um jede von der Methode zurückgegebene Instanz in die tatsächliche Instanz zu IEnumerable.Cast .

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

Allerdings , wenn Sie bereits die wissen , die tatsächliche Art , warum es nicht allready in der Abfrage verwenden? dynamic sollte mit Sorgfalt behandelt werden und nur wenn Sie wirklich müssen, was ich bezweifle, ist hier der Fall. Sie könnten zum Beispiel den tatsächlichen Typ als Typ-Parameter zur Methode hinzufügen:

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

Jetzt können Sie es wie folgt nennen:

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

Als Method ist ein wirklich schlechter Klassenname, wie auch posts . Sie sollten Ihren Klassennamen geben, die beschreiben, wofür sie dienen und was sie tun. Außerdem gibt es Namenskonventionen, die PascalCase hinweisen, PascalCase Namen für Klassen zu verwenden, die Ihre Klasse Posts . Schließlich, wenn Sie eine Aufzählung von posts , nehme ich an, dass die Klasse selbst einen einzigen Post darstellt, nicht viele, also möchten Sie eigentlich eine Klasse namens Post die Sie in einem IEnumerable<Post> speichern können.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum