我正在使用 Dapper 将来自 SQL Server 数据库的对象映射到 C# 类。我需要从中提取结果的存储过程之一可以具有可变数量的列,具体取决于上下文。这个结果集总是有一个主键列,然后是 0 到 30 个都是相同数据类型的附加列。
结果集的列基本是这样的:
CustomerID | Email1 | Email2 | Email3 | ...
Email*
列的数量取决于查询中客户存档的最大电子邮件地址数量。
在 C# 中捕获它的自然方法是使用这样的类:
class Customer {
int ID { get; set; }
string[] EmailAddresses { get; set; }
}
有没有办法使用 Dapper 将我的结果集映射到这样的对象?
最佳答案
如果您通过 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()
之前是否确实存在值它。
关于c# - Dapper - 将列数未知的结果集映射到具有数组属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38234218/