投射IEnumerable 與自定義類

c# casting dapper ienumerable

我最近一直在使用dapper,並希望製作一個動態方法,以便更容易用sql選擇。這是我的代碼:

類:

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

    }
}

這裡的呼叫功能:

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

它給了我一個錯誤that I cannot convert IEnumerable dynamic to IEnumerable Models.Posts

我該怎麼做才能讓它發揮作用。

一般承認的答案

從技術上講,您可以使用IEnumerable.Cast -method將從方法返回的每個實例強制轉換為實際實例。

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

但是,如果您已經知道實際類型,為什麼不在查詢中使用它呢? dynamic應該小心處理,只有你真的必須這樣做,我懷疑是這裡的情況。例如,您可以將實際類型作為type-parameter添加到方法中:

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

現在您可以按如下方式調用它:

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

作為一個旁邊的Method是一個非常糟糕的類名,也作為posts 。您應該提供您的班級名稱,以描述他們所服務的內容以及他們正在做的事情。此外,還有一些命名約定建議使用PascalCase -names來創建類Posts 。最後當你有一個posts的枚舉時,我想這個類本身代表一個帖子,而不是很多,所以你實際上想要一個名為Post的類,你可以存儲到IEnumerable<Post>



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因