Procedural crea un oggetto dinamico per Dapper

ado.net c# dapper sql-server tsql

Domanda

Ho visto molti post sulla creazione di oggetti ExpandoObject e così via, ma nel mio caso non funziona. Ho bisogno di creare un oggetto come

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

Fondamentalmente, stiamo usando Dapper e abbiamo bisogno di creare una query dinamicamente, dove la clausola WHERE è fabbricata da una data matrice di argomenti. Non stiamo generalizzando domande! È un singolo metodo che riceve un numero variabile di argomenti e dobbiamo controllare OR ogni valore su una singola colonna.

In questo momento, l'unica soluzione praticabile consiste nel ripristinare e utilizzare direttamente System.Data.SqlClient.SqlConnection o esiste un modo per farlo funzionare?

Aggiornare:

Questo è ciò che molto probabilmente dovrebbe funzionare, ma non:

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);

Risposta accettata

Solo per rispondere alla mia stessa domanda, visto che abbiamo trovato la soluzione giusta oggi.

In poche parole, abbiamo trovato gli IDynamicParameters E questa classe risolve semplicemente tutto, agendo come un Dictionary .

var inTerms = new Dapper.DynamicParameters();

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

Tutti sono felici!



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché