Mam słownik wartości Np. „Nazwa”: „Alex”
Czy istnieje sposób, aby przekazać to Dapperowi jako argumenty zapytania?
Oto przykład pokazujący, co chcę zrobić.
IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);
new DynamicParameters(dictionary)
i będzie działać dobrze.Wiem, że to stare pytanie (jakieś 5 lat), ale walczyłem z tym samym. Pełna odpowiedź znajduje się w komentarzach do drugiej odpowiedzi, ale pomyślałem, że podam tutaj pełny przykład.
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));
Lub, aby być w pełni dynamicznym, możesz utworzyć taką metodę, która będzie przyjmować dowolny model, dowolne zapytanie i dowolny zestaw parametrów zapytania:
public static IEnumerable<T> Get<T>(string query, Dictionary<string, object> dictionary) { IEnumerable<T> entities = connection.Query<T>(query, new DynamicParameters(dictionary)); return entities; }
A następnie wywołanie tej metody:
var results = Get<MyTable>(query, dictionary)
EDYTUJ DŁUGO PO
Ta odpowiedź wciąż zyskuje na popularności, więc najwyraźniej nadal jest potrzebna. Wziąłem to rozwiązanie i utworzyłem cały pakiet NuGet dostępu do danych zbudowany na bazie Dapper. Redukuje operacje CRUD i zapytań do jednej linii kodu.
Oto pakiet NuGet .
źródło
Można również użyć
ExpandoObject
jako parametru zapytania zamiast klasy specyficznej dla DapperaDynamicParameters
: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);
źródło