2016-07-06 39 views
3

我正在使用Dapper将来自SQL Server数据库的对象映射到C#类。根据上下文,我需要从中获取结果的存储过程之一可以具有可变数量的列。该结果集将始终有一个主键列,然后将有0到30个额外的列都将具有相同的数据类型。Dapper - 将具有未知列数的结果集与具有数组属性的对象进行对象

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

CustomerID | Email1 | Email2 | Email3 | ... 

Email*列的数量依赖于电子邮件地址的最高数量立案查询客户。

自然的方式在C#中捕捉到了这个是这样的一类:

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

有没有办法使用小巧精致的映射我的结​​果设定为这样一个对象的方法吗?

回答

2

如果你通过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()之前检查是否存在实际存在的值。
+0

谢谢。我不认为'dynamic'和'List'警告会在我的场景中引起任何问题。明天我会在这工作。 – JamesFaix

+0

该列表与数组相比将是完美的表现。来自动态的冲击很小,但至少值得注意。 –

+0

我认为节省的时间不是手动操作'DataTable's将不仅弥补它。 – JamesFaix

相关问题