2015-08-26 42 views
2

我在嘗試使用ServiceStack.Text將動態小巧結果序列化爲CSV,但我收到了換行符的集合。根據ServiceStack.Text,它可以處理匿名和IDictionary<string, object>類型。將動態小巧結果序列化爲CSV

 using (var conn = new SqlConnection(...)) 
     { 
      var data = conn.Query("select * from data"); 
      var output = CsvSerializer.SerializeToCsv(data); 

      Console.WriteLine(output); 
      Console.Read(); 
     } 

當我使用相同的類型,它的工作原理。

 IEnumerable<dynamic> list = new List<dynamic> 
     { 
      new 
      { 
       Name = "Nathan", 
       Id = 1, 
       Created = DateTime.UtcNow 
      } 
     }; 

     Console.WriteLine(CsvSerializer.SerializeToString(list)); 
     Console.Read(); 

我錯過了Dapper的返回類型是什麼?

我知道我可以通過投影到模型類來解決這個問題,但我的方法之美在於使用動力學。我有什麼選擇嗎?

回答

1

動態泛型IDictionary類似於Dapper返回的內容現在應該支持from this commit

此更改可從v4.0.43 +現在的available on MyGet獲得。

+1

哇,我怎麼給你買啤酒,@mythz?證實,它的工作完美無瑕。 – NATO24

2

Dapper的Query方法返回IEnumerable<dynamic>,這基本上是:IEnumerable<object> - 其中每行恰好實現IDictionary<string,object>。我不知道SS是否在尋找TIEnumerable<T>:在這種情況下,是的,那將不會很好。你可以嘗試:

var typed = data.Select(x => (IDictionary<string,object>)typed); 
var output = CsvSerializer.SerializeToCsv(typed); 

這確實投投影,因此,如果SerializeToCsv是一種通用的方法,它會知道該接口支持。

Dapper不會返回匿名類型。

+0

謝謝馬克,我試圖作爲內聯投影無濟於事。 – NATO24