如何为Dapper查询动态创建参数

本文关键字:动态 创建 参数 查询 Dapper | 更新日期: 2023-09-27 18:25:58

我有一个值字典,例如"Name":"Alex"

有没有一种方法可以将其作为查询的参数传递给Dapper?

这是一个展示我想做什么的例子

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

如何为Dapper查询动态创建参数

是:

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

请注意,如果您从一个对象开始(dapper的常用方法),您也可以使用这个模板和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));

或者,为了完全动态,您可以创建这样的方法,它将采用任何模型、任何查询和任何一组查询参数:

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)

之后长时间编辑

这个答案继续得到支持,所以这显然仍然是一个需要。我采用了这个解决方案,并在Dapper的基础上创建了一个完整的数据访问NuGet包。它将CRUD和查询操作简化为一行代码。

这是NuGet包。

也可以使用ExpandoObject作为查询的参数,而不是Dapper特定的类DynamicParameters:

ExpandoObject param = new ExpandoObject();
IDictionary<string, object> paramAsDict = param as IDictionary<string, object>;
paramAsDict.Add("foo", 42);
paramAsDict.Add("bar", "test");
MyRecord stuff = connection.Query<MyRecord>(query, param);