Crear proceduralmente un objeto dinámico para Dapper

ado.net c# dapper sql-server tsql

Pregunta

He visto muchas publicaciones sobre cómo crear objetos de ExpandoObject , pero no funciona en mi caso. Necesito crear un objeto como

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

Básicamente, estamos utilizando Dapper y tenemos que crear una consulta de forma dinámica, donde la cláusula WHERE se fabrica a partir de una matriz de argumentos dada. No estamos generalizando consultas! Es un método único que recibe una cantidad variable de argumentos y necesitamos verificar OR cada valor en una sola columna.

En este momento, la única solución viable es revertir y usar directamente System.Data.SqlClient.SqlConnection , o hay alguna forma de hacer que esto funcione?

Actualizar:

Esto es lo que probablemente debería funcionar, pero no:

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

Respuesta aceptada

Solo para responder mi propia pregunta, ya que encontramos la solución adecuada el día de hoy.

En pocas palabras, encontramos IDynamicParameters Y esta clase simplemente resuelve todo, actuando como un Dictionary .

var inTerms = new Dapper.DynamicParameters();

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

¡Todos están felices!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué