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

Jam*_*aix 5 c# sql-server orm dapper

我正在使用 Dapper 将来自 SQL Server 数据库的对象映射到 C# 类。我需要从中提取结果的存储过程之一可以具有可变数量的列,具体取决于上下文。此结果集始终具有一个主键列,然后是 0 到 30 个附加列,这些列都具有相同的数据类型。

结果集列基本上是这样的:

CustomerID | Email1 | Email2 | Email3 | ...
Run Code Online (Sandbox Code Playgroud)

其中列数Email*取决于查询中客户存档的最大电子邮件地址数。

在 C# 中捕获此问题的自然方法是使用如下类:

class Customer {
    int ID { get; set; }
    string[] EmailAddresses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 Dapper 将我的结果集映射到这样的对象?

Dav*_*d L 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>();
}
Run Code Online (Sandbox Code Playgroud)

几个关键点:

  • 将数组改为列表,以便我们可以轻松动态地向其中添加数据。
  • 与直接反序列化为强类型相比,动态总是会对性能产生较小的影响。
  • 这不会检查属性中保存的数据的类型Value,也不会在调用.ToString()它之前检查是否确实存在一个值。

  • 好吧,既然如此,欢迎来到另一边:)。这是一个非常适合居住的地方。 (2认同)