如何dynamic地为Dapper查询创build参数

我有一个值的字典例如“名字”:“亚历克斯”

有没有办法将这个传递给Dapper作为查询的参数?

这是一个显示我想要做什么的例子。

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

2 Solutions collect form web for “如何dynamic地为Dapper查询创build参数”

是:

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

然后传递dbArgs代替args

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

或者,您可以编写自己的实现IDynamicParameters的类。

请注意,如果您是从一个对象(通常使用精简方法)开始的,那么您也可以将此模板与DynamicParameters作为起点:

 var dbArgs = new DynamicParameters(templateObject); 

我知道这是一个古老的问题(像5岁那样),但是我正在为同样的事情而苦苦挣扎。 完整的答案是在对其他答案的评论中,但我想我会在这里提供一个完整的例子。

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

或者,为了完全dynamic化,可以创build一个像这样的方法,它将采用任何模型,任何查询以及任何一组查询参数:

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

然后调用这个方法:

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