Dapper 쿼리에 대한 인수를 동적으로 만드는 방법


88

값 사전이 있습니다. 예 : "Name": "Alex"

이것을 Dapper에 쿼리에 대한 인수로 전달하는 방법이 있습니까?

다음은 내가 원하는 것을 보여주는 예입니다.

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

답변:


144

예:

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

25
할 수 new DynamicParameters(dictionary)있으며 잘 작동합니다.
asgerhallas

1
@asgerhallas는 2 월에 사실이 아니었을 수도 있지만 그렇습니다 : 당신 말이 맞습니다 – 지금은 확실히 사실입니다
Marc Gravell

11
새 DynamicParameters (dictionary)가 작동하려면 사전이 IEnumerable <KeyValuePair <string, object >> (예 : Dictionary <string, object>) 여야합니다. Dictionary <string, string>이 ​​작동하지 않았습니다.
Zar Shardan 2014 년

17

나는 이것이 오래된 질문 (예 : 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 패키지 입니다.


1

ExpandoObjectDapper 특정 클래스 대신를 쿼리의 매개 변수로 사용할 수도 있습니다 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.