如何使用Dapper Dot Net从数据库结果映射到Dictionary对象?

如果我有一个简单的查询,如:

string sql = "SELECT UniqueString, ID FROM Table"; 

我想将它映射到一个字典对象,如:

 Dictionary<string, int> myDictionary = new Dictionary<string, int>(); 

我将如何与Dapper做到这一点?

我假设它是这样的:

 myDictionary = conn.Query<string, int>(sql, new { }).ToDictionary(); 

但无法弄清楚正确的语法。

已经有各种各样的方式显示; 我个人只使用非genericsapi:

 var dict = conn.Query(sql, args).ToDictionary( row => (string)row.UniqueString, row => (int)row.Id); 

作品也没有额外的类:

 var myDictionary = conn.Query<string, int, KeyValuePair<string,int>>(sql, (s,i) => new KeyValuePair<string, int>(s,i)) .ToDictionary(kv => kv.Key, kv => kv.Value); 

注意 :使用Dapper.NET 3.5版本时,采用第一种,第二种和返回types的查询方法需要您指定更多的参数,因为.NET 4.0和.NET 4.5版本利用可选参数 。

在这种情况下,下面的代码应该工作:

 string splitOn = "TheNameOfTheValueColumn"; var myDictionary = conn.Query<string, int, KeyValuePair<string,int>>(sql, (s,i) => new KeyValuePair<string, int>(s,i), null, null, false, splitOn, null, null) .ToDictionary(kv => kv.Key, kv => kv.Value); 

大多数参数将恢复为默认值,但splitOn是必需的,否则将默认值为'id'。

对于返回两列“ ID ”和“ Description ”的查询, splitOn应设置为“ Description ”。

我不确定你想做什么是可能的。 如果你定义一个类来将查询映射到这个变得更加微不足道:

 public class MyRow { public int Id { get; set; } public string UniqueString { get; set; } } 

那么,你会这样做:

 var sql = "SELECT UniqueString, ID FROM Table"; var myDictionary = conn.Query<MyRow>(sql).ToDictionary(row => row.UniqueString, row => row.Id); 

Dapper也有一个ExecuteReader的扩展方法。 所以,你也可以这样做:

 var sql = "SELECT UniqueString, ID FROM Table"; var rows = new List<Dictionary<string, int>>(); using (var reader = cn.ExecuteReader(sql)) { while (reader.Read()) { var dict = new Dictionary<string, int>(); for (var i = 0; i < reader.FieldCount; i++) { dict[reader.GetName(i)] = reader.GetInt32(i); } rows.Add(dict); } } 

这种方法在不知道列名的情况下工作。 此外,如果您不知道数据types,则可以将Dictionary<string,int>更改为Dictionary<string,object> ,将GetInt32(i)更改为GetValue(i)