问题描述
比如当前有如下的SQL
查询语句:
string sql = "SELECT UniqueString, ID FROM Table";
以上SQL
语句查询出来的结果包含两个字段,现在想把这两个字段分别映射到一个字典中,其中的字典键为UniqueString
对应的值,比如这样的:
Dictionary<string, int> myDictionary = new Dictionary<string, int>();
需要使用Dapper实现以上需求的映射,如下的实现是错误的:
myDictionary = conn.Query<string, int>(sql, new { }).ToDictionary();
方案一
直接使用ToDictionary()
方法:
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);
或者
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);
方案三
首先,定义一个键值对对应的类:
public class MyRow
{
public int Id { get; set; }
public string UniqueString { get; set; }
}
然后,使用Dapper
进行查询:
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);
}
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册