Sérialiser le résultat dynamique de Dapper en CSV

c# csv dapper dynamic servicestack

Question

J'essaie de sérialiser un résultat Dapper dynamique en CSV en utilisant ServiceStack.Text, mais je reçois une collection de sauts de ligne. Selon ServiceStack.Text, il peut gérer à la fois les types anonymous et 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();
        }

Quand j'utilise le même type, ça marche.

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

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

Qu'est-ce qui me manque sur le type de retour de Dapper?

Je sais que je peux résoudre ce problème en projetant sur une classe de modèle, mais la beauté de mon approche réside dans l'utilisation de la dynamique. Ai-je des options?

Réponse acceptée

dynamic Generic IDictionary ressemble à ce que Dapper doit désormais récupérer de ce commit .

Cette modification est disponible à partir de la version 4.0.43 +, désormais disponible sur MyGet .


Réponse d'expert

La méthode Query IEnumerable<dynamic> renvoie IEnumerable<dynamic> , qui est essentiellement: IEnumerable<object> - où chaque ligne implémente IDictionary<string,object> . Je me demande si SS recherche le T est IEnumerable<T> : dans ce cas, oui, cela ne fonctionnera pas bien. Tu pourrais essayer:

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

Cela fait la distribution dans la projection, de sorte que si SerializeToCsv est une méthode générique, elle connaîtra le support de l'interface.

Dapper ne renvoie pas les types anonymes.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi