값 사전이 있습니다. 예 : “Name”: “Alex”
이것을 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)
나중에 편집
이 답변은 계속해서 찬성 투표를 받으므로 분명히 여전히 필요합니다. 이 솔루션을 사용하여 Dapper 위에 빌드 된 전체 데이터 액세스 NuGet 패키지를 만들었습니다. CRUD 및 쿼리 작업을 한 줄의 코드로 줄입니다.
다음은 NuGet 패키지 입니다.
답변
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);