2017-04-03 68 views
2

我是Dapper的新手。讓我解釋我想達到的目標。我有簡單的查詢是從DB返回列,我不想創建實體(Property)類來填充數據。我想爲此使用動態類型。以下是我的代碼:如何處理Dapper返回鍵值對來自LINQ的動態

public dynamic GetABC(int year) 
    { 

     using (var db = new MySql.Data.MySqlClient.MySqlConnection(ClsConnectionString.connectionString)) 
     { 

      string query = string.Format(@"SELECT * FROM ranking where YEAR(eventdate)='{0}') ORDER BY eventdate DESC, eventid ASC",year); 
      //return db.Query<RankingEntity>(query, commandType: System.Data.CommandType.Text).AsList(); 
      var a = (IEnumerable<dynamic>)db.Query(query, null, null, true, null, CommandType.Text).ToList(); 
      return a; 
     } 
    } 

它返回我的Key Value對。如下圖所示: Dapper Row

有什麼辦法,我只寫了一個通用的方法來獲取列表作爲「財產」 =「值」作爲通常我們得到當我們用任何實體類。

我不確定,如果它是可以實現的,但我希望瞭解它是否可行並希望在我們的應用程序中實現。

我可以通過實現循環通過我不想要的dapperrows來實現這一點。因爲如果會有10000行循環會迭代10000次。

在此先感謝。

+0

DapperRow是一個內部類的小巧玲瓏的,可以直接固定 - 鑄造成'的IDictionary <字符串,對象>'其中有一個關鍵字符串和值對象 –

+0

@MrinalKamboj,請你更新上面的代碼來獲得這個。理解 –

回答

3

正如我所提到的DapperRow是Dapper的一個內部類,它可以直接轉換爲IDictionary<string,object>,因爲它實現IDictionary接口。所有你需要做的是:

var a = db.Query(query, null, null, true, null, CommandType.Text).Select(x => x as IDictionary<string,object>); 

現在的結果將是IEnumerable<IDictionary<string,object>>類型,它可以被用來提取所有需要的信息,因爲列名的鍵和相應的行值是每個元素的值IEnumerable

還要檢查,這可能也是工作,但我不知道:

var a = (IEnumerable<IDictionary<string,object>>)db.Query(query, null, null, true, null, CommandType.Text); 
+0

會更好,它會以相同的DapperRow返回。如上。 –

+0

你可以強制轉換,DapperRow僅適用於調試器 –

+0

TypeCast到我的實體類? –