2016-11-26 58 views
3

我最近一直在使用dapper,並希望做一個動態的方法,可以更容易地選擇SQL與事情。 這是我的代碼:鑄造IEnumerable <dynamic>與自定義類

類:

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

我怎樣才能使它工作。

回答

5

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

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

但是,如果你媒體鏈接知道的實際類型,爲什麼在查詢中不使用它媒體鏈接? dynamic應該小心處理,只有當你真的需要處理,我懷疑是這種情況。例如,你可以實際類型爲類型參數添加到方法:

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的名稱來製作班級Posts。最後,當你列舉了posts時,我認爲這個類本身代表一個單獨的帖子,並不是很多,所以你實際上想要一個名爲Post的類,你可以將它存儲到IEnumerable<Post>

+0

謝謝你的簡要回答。你的解決方案讓我大開眼界,我還沒有考慮過使用IEnumerable T。關於類名,它只是用於這個例子的情況,但是,對於名稱選擇我可以稍微努力一點。 – Harugawa