如何動態地為Dapper查詢創建參數

.net c# dapper

我有一個價值字典例如“姓名”:“亞歷克斯”

有沒有辦法將此傳遞給Dapper作為查詢的參數?

這是一個顯示我想要做的事情的例子。

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

一般承認的答案

是:

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)


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因