Créer de manière procédurale un objet dynamique pour Dapper

ado.net c# dapper sql-server tsql

Question

J'ai vu beaucoup de messages sur la création d'objets ExpandoObject et autres, mais cela ne fonctionne pas dans mon cas. J'ai besoin de créer un objet comme

var someObj = new {
    term1 = "someValue",
    term2 = "other",
    ...
};

Fondamentalement, nous utilisons Dapper et nous devons créer une requête de manière dynamique, où la clause WHERE est fabriquée à partir d'un tableau d'arguments donné. Nous ne généralisons pas les requêtes! C'est une méthode unique recevant un nombre variable d'arguments et nous devons vérifier OR chaque valeur sur une seule colonne.

À l'heure actuelle, la seule solution viable consiste à rétablir et à utiliser directement System.Data.SqlClient.SqlConnection , ou existe-t-il un moyen de le faire fonctionner?

Mettre à jour:

C'est probablement ce qui devrait fonctionner, mais pas:

string inWhere = null;
dynamic inTerms = new ExpandoObject();
IDictionary<string, object> inTermsDict = inTerms;

if (!(string.IsNullOrEmpty(filter.Term) || string.IsNullOrWhiteSpace(filter.Term))) {
    inWhere = "(" + string.Join(" OR ", filter.Terms.Select((t, i) => "{0} LIKE @p" + i)) + ")";
    int termIndex = 0;
    foreach (string term in filter.Terms) {
        inTermsDict.Add("p" + (termIndex++), term);
    }
}

// ...

var rows = db.Query("SELECT * FROM {table} WHERE {baseCondition}" +
     (string.IsNullOrEmpty(inWhere) ? "" : string.Format(" AND " + inWhere, "columnName")),
     inTerms as object);

Réponse acceptée

Juste pour répondre à ma propre question, car nous avons trouvé la solution appropriée plus tôt dans la journée.

En termes simples, nous avons trouvé les IDynamicParameters Et cette classe résout simplement tout, agissant comme un Dictionary .

var inTerms = new Dapper.DynamicParameters();

inTerms.Add("@p" + (termIndex++), somveValue);

Tout le monde est content!




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