如何使用Dapper自动将剩余列映射到字典?

4

我试图使用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

使用 splitOn: "Foo" 的 Multimap,然后在 lambda 中自己进行映射?编辑 不是要说你应该知道这个。 - Charlieface
@Charlieface:这对我来说还是有点模糊,尽管我在Dapper的动态和静态模式下都有经验。 - Robert Harvey
@RobertHarvey 我知道,这只是一个评论,希望有人有时间写一个完整的答案。请参阅 https://dev59.com/_2s05IYBdhLWcg3wD9wB 以获取更多信息。 - Charlieface
啊,没错。多重映射。我忘记了。 - Robert Harvey
@CaiusJard:啊,我忘记了我之前问过这个问题。也许我应该悬赏并删除这个问题。 - michael
显示剩余2条评论
1个回答

0

将您的查询作为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 类


2
我在想,如果只是将ID和Code留在字典中,并让类的属性来设置/获取它们,是否会使任何事情更简单? - Caius Jard

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