2017-04-03 117 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到我的实体类? –