2012-02-28 19 views
60

tengo un diccionario de valores Por ejemplo, "Nombre": "Alex"Cómo crear argumentos para una consulta Dapper dinámicamente

¿Hay una 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

99

Sí:

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

A continuación, pasar dbArgs en lugar de args:

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

Alternativamente, usted puede escribir su propia clase que implementa IDynamicParameters.

Tenga en cuenta que si usted está comenzando a partir de un objeto (el enfoque habitual con pulcro), también se puede utilizar esta plantilla con DynamicParameters como punto de partida:

var dbArgs = new DynamicParameters(templateObject); 
+12

Tenga en cuenta que puede hacer 'nuevos DynamicParameters (dictionary)' y funcionará muy bien. – asgerhallas

+0

@asgerhallas que podría no haber sido cierto en febrero, pero sí: tiene razón; eso es ciertamente cierto ahora –

+7

para que los nuevos DynamicParameters (diccionario) funcionen, el diccionario debe ser un IEnumerable > , por ejemplo Dictionary . El diccionario no funcionó. –

3

Sé que esto es una cuestión de edad (como , 5 años) pero yo 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 completamente dinámico, puede crear un método de este tipo, que se llevará a cualquier modelo, cualquier 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) 
Cuestiones relacionadas