将动态Dapper结果序列化为CSV

时间:2015-08-26 08:27:39

标签: c# csv dynamic servicestack dapper

我正在尝试使用ServiceStack.Text将动态Dapper结果序列化为CSV,但我收到了一系列换行符。根据ServiceStack.Text,它可以处理匿名和IDictionary<string, object>类型。

        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的回归类型缺少什么?

我知道我可以通过投射到模型类来解决这个问题,但我的方法的优点在于动态的使用。我有任何选择吗?

2 个答案:

答案 0 :(得分: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不会返回匿名类型。

答案 1 :(得分:1)

动态通用IDictionary就像现在支持Dapper返回的那样from this commit

此更改可从v4.0.43 +现在available on MyGet获得。