2016-07-06 47 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

相關問題