如何使用Dapper点网从数据库结果映射到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();

但是找不到正确的语法。

jpshook asked 2019-11-15T12:27:06Z
6个解决方案
102 votes

已经显示了各种方式; 我个人只是使用非通用api:

var dict = conn.Query(sql, args).ToDictionary(
    row => (string)row.UniqueString,
    row => (int)row.Id);
Marc Gravell answered 2019-11-15T12:27:28Z
19 votes

也可以在没有其他类的情况下工作:

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版本时,采用第一种,第二种和返回类型的Query方法需要指定更多参数,因为.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”。

Tim Schmelter answered 2019-11-15T12:28:23Z
12 votes
string strSql = "SELECT DISTINCT TableID AS [Key],TableName AS [Value] FROM dbo.TS_TStuctMaster";
Dictionary<string,string> dicts = sqlConnection.Query<KeyValuePair<string,string>>(strSql).ToDictionary(pair => pair.Key, pair => pair.Value);

您可以使用别名和强类型。

别名是关键点,与KeyValuePair类型的“键”和“值”的属性匹配。

它在强类型下工作并且运行良好。

我不喜欢动态类型。 在某些情况下会带来灾难。 而且,装箱和拆箱会带来性能损失。

Allen.Cai answered 2019-11-15T12:29:09Z
7 votes

我不确定您要做什么。 如果定义一个类来将查询映射到该类,则变得更加简单:

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);
w.brian answered 2019-11-15T12:29:42Z
6 votes

Dapper还具有Dictionary<string,int>的扩展方法。因此,您也可以这样做:

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

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

dalenewman answered 2019-11-15T12:30:16Z
4 votes

如果使用> .net 4.7或netstandard2,则可以使用值元组。 该代码简洁明了,没有使用动态特性。

var sql = "SELECT UniqueString, Id  FROM Table";
var dict = conn.Query<(string UniqueString, int Id)>(sql)
           .ToDictionary(t => t.UniqueString,t => t.Id);
herostwist answered 2019-11-15T12:30:44Z
translate from https://stackoverflow.com:/questions/14780767/how-to-map-to-a-dictionary-object-from-database-results-using-dapper-dot-net