我正在使用Dapper将来自SQL Server数据库的对象映射到C#类。我需要从中提取结果的存储过程之一可以根据上下文具有可变数量的列。此结果集将始终具有主键列,然后是0到30个将具有相同数据类型的其他列。
结果集列基本上是这样的:
CustomerID | Email1 | Email2 | Email3 | ...
Email*
列的数量取决于查询中客户的最大电子邮件地址数。
在C#中捕获它的自然方法是使用类似这样的类:
class Customer {
int ID { get; set; }
string[] EmailAddresses { get; set; }
}
有没有办法使用Dapper将我的结果集映射到这样的对象?
答案 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>();
}
几个关键点:
Value
属性中保存的数据的类型,也不会在调用.ToString()
之前检查是否存在实际值。