Obtenir des valeurs de propriété de dynamique

.net-4.5 dapper oracle11g

Question

J'utilise Dapper avec dynamique car la table à interroger n'est pas connue avant l'exécution, donc les classes POCO ne sont pas possibles.

Je retourne les résultats de Dapper via WebAPI. Pour économiser de la bande passante, je dois renvoyer uniquement les valeurs de Dapper, pas les noms de propriété, par exemple:

{
    7,"2013-10-01T00:00:00",0,"AC",null,"ABC","SOMESTAGE"
},...

Et pas:

{
TID: 7,
CHANGE_DT: "2013-10-01T00:00:00",
EFFECTIVE_APPTRANS: 0,
EFFECTIVE_APPTRANS_STATUS: "AC",
DEVICE: null,
PROCESS: "ABC",
STAGE: "SOMESTAGE"
},...

J'ai du mal à trouver un moyen raisonnable de le faire. J'ai essayé d'abuser de la fonctionnalité de mappage de Dapper:

var tableData = Database.Query<dynamic, dynamic, dynamic>(connectInfo, someResource.sql,
    (x, y) =>
    {
        List<object> l = new List<object>();
        object o = x;

        foreach(var propertyName in o.GetType().GetProperties().Select(p => p.Name)) {
            object value = o.GetType().GetProperty(propertyName).GetValue(o, null);
            l.Add(value);
        }
        return l as dynamic;
    },
    new {implantId, pendingApptrans},
    splitOn: "the_last_column");

J'ai également essayé de demander à Dapper de retourner une liste en utilisant le même code de base.

L'idée était que j'extrayais des valeurs de propriété dans la fonction map car cela me permettait de jouer avec des lignes avant que quelque chose ne soit renvoyé, mais j'obtiens des résultats vides sans erreur:

[
    [ ], [ ], [ ], [ ], [ ], [ ], [ ]
]

De plus, je ne connais aucun nom de colonne à diviser, que la fonctionnalité de mappage souhaite. Cependant, même lorsque j'entre le nom de la dernière colonne d'une requête de test, les résultats sont identiques.

Comment puis-je retourner uniquement les valeurs de la valeur de retour dynamique de Dapper? Dois-je recourir au post-traitement de la dynamique après l'appel Dapper?

Réponse acceptée

Pour cet ensemble particulier d'exigences, oui, vous devez post-traiter; Par exemple, vous pouvez DapperRow en DapperRow ou IDictionary<string,object> . Vous pouvez également utiliser l'API IDataReader que dapper expose maintenant.



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