【问题标题】:How to use Dapper to automatically map remaining columns to dictionary?如何使用 Dapper 自动将剩余列映射到字典?
【发布时间】:2021-01-23 19:15:26
【问题描述】:

我正在尝试使用 Dapper 映射到我的 DTO:

public class MyDto
{
    public int Id { get; set; }
    public string Code { get; set; }
    public IDictionary<string, object> AdditionalColumns { get; set; }
}

我可以让MyDto 的实例根据约定填充前两个属性,但我不确定如何告诉 Dapper 将所有剩余的列映射到字典中。

connection.Query<MyDto>("Get_Something", commandType: CommandType.StoredProcedure, param: parameters);

存储过程返回以下内容:

Id: INT
Code: VARCHAR(32)
Foo: VARCHAR(16)
Bar: DATETIME

【问题讨论】:

  • Multimap 与splitOn: "Foo" 然后自己映射到lambda? 编辑并不是说你应该知道这一点
  • @Charlieface:这是一个很大的模糊,即使对我来说也是如此,而且我对 Dapper 的动态和静态模式都有经验。
  • @RobertHarvey 我知道,这只是对有时间写完整答案的人的评论。请参阅stackoverflow.com/questions/7472088/… 了解更多信息
  • 啊,是的。多重映射。忘记了。
  • 问题是任何解决方案都必须同时考虑静态和动态方面。 id 和 string 可能必须手动映射,而不是依赖 Dapper 的反射。

标签: c# .net-core mapping dapper dto


【解决方案1】:

将您的查询作为dynamic 对象返回。

var query = connection.Query<dynamic>(
    "Get_Something", commandType: CommandType.StoredProcedure, param: parameters);

然后,像这样映射您的 DTO:

var results = new List<MyDto>();

foreach(item in query)
{
    var dictionary = new RouteValueDictionary(item).ToDictionary(x => x.Key, y => y.Value);
    var dto = new MyDto
    {
        Id = dictionary["Id"];
        Code = dictionary["Code"];
    }
    dictionary.Remove("Id");
    dictionary.Remove("Code");
    dto.AdditionalColumns = dictionary;
    results.Add(dto)
}   

参考
RouteValueDictionary Class

【讨论】:

  • 我想知道,将 ID 和 Code 留在字典中并设置/获取类的道具会更简单吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2018-11-05
  • 2018-03-14
  • 2021-08-31
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多