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

时间:2012-02-28 12:12:04

标签: c# .net dapper

我有一个值词典,例如“姓名”:“Alex”

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

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

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

3 个答案:

答案 0 :(得分:117)

是:

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

答案 1 :(得分:7)

我知道这是一个古老的问题(比如,5岁),但我正在努力做同样的事情。完整的答案在对其他答案的评论中,但我想我会在这里提供一个完整的例子。

<?php
    $_POST = json_decode(file_get_contents('php://input'), true);
    $response = array();

    $response["Condicao"] = $_POST["Condicao"];
    $response["Field"] = $_POST["Field"];

    $response['sucess'] = 1;
    $response['other'] = "test";

    echo json_encode($response);
?>

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

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

答案 2 :(得分:0)

也可以使用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);