Dapper:从读取器中读取到字典的方法

4

我的读者从存储过程中读取内容,其中第一个select语句为

 select id , name from FSubsystem

在10个选择语句中,我像下面这样声明了一个字典:

Dictionary SubsystemMApping = new Dictionary();

var reader = connection.QueryMultiple(...);

我需要将第一个select语句的值读取到字典SubsystemMapping中。 id-作为键, name-作为值

我尝试使用reader.Read.Todictionary()进行操作,但无法成功。我不是很熟悉Func和Action,这就是我认为我无法正确理解Todictionary的2个重载的原因。

有人可以帮忙吗?

2个回答

10

对于通用 API,Stan 已经进行了描述。非通用的 Read API 意味着您也可以通过动态方式绕过 POCO:

var lookup = reader.Read().ToDictionary(x => (int)x.id, x => (string)x.name);
基本上,通过“动态”,它将列重新公开为虚拟属性。

基本上,通过“动态”,它将列重新公开为虚拟属性。


对于那些想知道的,这里的“reader”是Dapper的一部分,而不是“DataReader”。感谢Mark,现在我要回去继续阅读你的博客了。 - Stan R.
@Stan 确实,reader 是通过 QueryMultiple 从问题中获取的。 - Marc Gravell
只是想为那些可能错过了的人澄清一下。 - Stan R.
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Chris Marisic

8
想象一下你收到了一个 POCO 对象。类似于:
public class Item 
{
   public int Id { get; set;}
   public string Name { get; set;}
}

现在想象一下,您有一个IEnumerable 集合,该集合已填充(这很可能是Dapper返回的内容)。
要使用ToDictionary方法,您有两个重要的重载。
var dictionary = itemList.ToDictionary( item => item.Id );

这会返回一个Dictionary<int,Item>。字典的键是每个item.Id属性。

键/值重载:

var dictionary = itemList.ToDictionary( item => item.Id , item => item.Name );

这个重载使用指定的item.Id作为键,item.Name作为值创建一个Dictionary<int,string>

还有两个重载允许您传递自定义的比较器用于确定键。


我建议添加使用 buffered: false,这样当调用 ToDictionary 时就不需要对结果集进行多次迭代。 - Chris Marisic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接