Dapper - 将列数未知的结果集映射到带有数组属性的对象

5
我使用Dapper将从SQL Server数据库中获取的对象映射到C#类中。我需要从其中一个存储过程中提取结果,这个结果集根据上下文可以具有可变数量的列。该结果集始终会有一个主键列,然后会有0到30个额外列,这些列都是相同的数据类型。
结果集列基本上像这样:
CustomerID | Email1 | Email2 | Email3 | ...

当查询的客户中拥有的电子邮件地址数量最多时,Email*列的数量取决于该数量。

在C#中自然的方式是使用类似以下的类:

class Customer {
    int ID { get; set; }
    string[] EmailAddresses { get; set; }
}

有没有一种方法可以使用Dapper将我的结果集映射到像这样的对象?

1个回答

6

通过dynamic可以进行一些魔法操作,从而实现一些可能性。

var user = connection.Query("spGetUser", commandType: CommandType.StoredProcedure)
        .Select(x =>
        {
            var result = new Customer { ID = x.Id };
            foreach (var element in x)
            {
                if (element.Key.Contains("Email"))
                    result.EmailAddresses.Add(element.Value.ToString());
            }
            return result;
        }).FirstOrDefault();

public class Customer
{
    public int ID { get; set; }
    public List<string> EmailAddresses { get; set; } = new List<string>();
}

几个关键点:

  • 将数组更改为列表,以便我们可以轻松地动态添加数据。
  • 与直接反序列化到强类型相比,动态始终会有一定的性能损失。
  • 这不检查Value属性中保存的数据类型,也不检查在调用.ToString()之前是否实际存在值。

谢谢。我认为在我的情况下,“dynamic”和“List”注意事项不会引起任何问题。我明天会在工作中尝试一下。 - JamesFaix
是的,我已经将项目中许多具有标准结果集结构的查询移动到了Dapper,并且减少了混乱和硬编码列名字符串,效果非常惊人。 - JamesFaix
1
当然可以 :)。它是一个非常棒的工具。其灵活性和强大功能令人惊叹。 - David L
有一段时间,我一直避免使用ORM,因为我认为它必须涉及大量的XML配置文件。 - JamesFaix
2
那么,在这种情况下,欢迎来到另一边:)。 这是一个非常棒的居住地。 - David L
显示剩余2条评论

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