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


86

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

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

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

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

Answers:


140

是:

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

25
请注意,您可以做new DynamicParameters(dictionary),并且可以正常工作。
asgerhallas 2012年

1
@asgerhallas在2月可能并非如此,但是的:您是对的-现在肯定是对的
Marc Gravell

10
为了使新的DynamicParameters(dictionary)工作,字典必须是IEnumerable <KeyValuePair <字符串,对象>>,例如Dictionary <string,object>。字典<string,string>无效。
Zar Shardan 2014年

17

我知道这是一个古老的问题(例如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包


0

也可以使用aExpandoObject作为查询的参数,而不是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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.