Cómo crear argumentos para una consulta Dapper dinámicamente

.net c# dapper

Pregunta

Tengo un diccionario de valores, por ejemplo, "Nombre": "Alex"

¿Hay alguna manera de pasar esto a Dapper como argumentos para una consulta?

Aquí hay un ejemplo que muestra lo que quiero hacer.

IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);

Respuesta aceptada

Sí:

var dbArgs = new DynamicParameters();
foreach(var pair in args) dbArgs.Add(pair.Key, pair.Value);

Luego pasa dbArgs en lugar de args :

var stuff = connection.Query<ExtractionRecord>(query, dbArgs);

Alternativamente, puede escribir su propia clase que implemente IDynamicParameters .

Tenga en cuenta que si está comenzando desde un objeto (el enfoque habitual con dapper), también puede usar esta plantilla con DynamicParameters como punto de partida:

var dbArgs = new DynamicParameters(templateObject);

Respuesta popular

Sé que esta es una vieja pregunta (como, 5 años) pero estaba luchando con lo mismo. La respuesta completa está en los comentarios a la otra respuesta, pero pensé que ofrecería un ejemplo completo aquí.

string query = "SELECT * FROM MyTableName WHERE Foo = @Foo AND Bar = @Bar";

Dictionary<string, object> dictionary = new Dictionary<string, object>();
dictionary.Add("@Foo", "foo");
dictionary.Add("@Bar", "bar");

var results = connection.Query<MyTableName>(query, new DynamicParameters(dictionary));

O, para ser totalmente dinámico, puede crear un método como este, que tomará cualquier modelo, consulta y cualquier conjunto de parámetros de consulta:

    public static IEnumerable<T> Get<T>(string query, Dictionary<string, object> dictionary)
    {
        IEnumerable<T> entities = connection.Query<T>(query, new DynamicParameters(dictionary));
        return entities;
    }

Y luego llamar a este método:

var results = Get<MyTable>(query, dictionary)


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é