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

Cog*_*ave 77 .net c# dapper

我有一个价值字典例如"姓名":"亚历克斯"

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

这是一个显示我想要做的事情的例子.

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

Mar*_*ell 126

是:

var dbArgs = new DynamicParameters();
foreach(var pair in args) dbArgs.Add(pair.Key, pair.Value);
Run Code Online (Sandbox Code Playgroud)

然后通过dbArgs代替args:

var stuff = connection.Query<ExtractionRecord>(query, dbArgs);
Run Code Online (Sandbox Code Playgroud)

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

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

var dbArgs = new DynamicParameters(templateObject);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您可以执行`new DynamicParameters(dictionary)`并且它可以正常工作. (21认同)
  • 为了使新的DynamicParameters(字典)起作用,字典必须是IEnumerable <KeyValuePair <string,object >>,例如Dictionary <string,object>.字典<string,string>不起作用. (10认同)

Cas*_*ton 11

我知道这是一个古老的问题(比如,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));
Run Code Online (Sandbox Code Playgroud)

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

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

然后调用此方法:

var results = Get<MyTable>(query, dictionary)
Run Code Online (Sandbox Code Playgroud)