序列化动态Dapper结果到CSV

本文关键字:CSV 结果 Dapper 动态 序列化 | 更新日期: 2023-09-27 18:09:48

我正在尝试使用ServiceStack序列化动态Dapper结果到CSV。短信,但我收到了一堆换行符。根据ServiceStack。文本,它可以处理匿名和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的返回类型,我错过了什么?

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

序列化动态Dapper结果到CSV

动态泛型字典,就像Dapper返回的那样,现在应该从这次提交中支持。

这个变化从v4.0.43+开始,现在MyGet上可以使用。

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不返回匿名类型