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

时间:2016-07-06 21:38:42

标签: c# sql-server orm dapper

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

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

CustomerID | Email1 | Email2 | Email3 | ...

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

在C#中捕获它的自然方法是使用类似这样的类:

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

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

1 个答案:

答案 0 :(得分:3)

如果你通过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>();
}

几个关键点:

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