2016-06-06 3 views
0

Dapper로 저장 프로 시저를 대량 호출하려고합니다. 각 호출은 다른 결과 집합을 반환하므로 QueryMultiple을 사용하고있었습니다. 나는이 같은 매개 변수를 작성하는 경우 :Dapper의 QueryMultiple을 저장 프로 시저와 함께 사용할 수 있지만 매번 다른 매개 변수 값을 사용할 수 있습니까?

var parameters = new DynamicParameters(); 
    // The stored proc accepts a single integer, but I want to pass multiple so each call had a new value. 
    parameters.Add("LookupID", lookupIds); 

    var resultSet = connection.QueryMultiple("SPName", parameters, commandType: System.Data.CommandType.StoredProcedure); 

을 내가 저장 프로 시저가 지정된 인수를 너무 많이 가지고 오류가 발생합니다. 그러면 내가 어떻게이 일을 성취 할 수 있습니까?

+0

QueryMultiple의 주요 아이디어는 저장 프로 시저가 여러 결과 집합을 반환한다는 것입니다. 다른 매개 변수 정의를 사용하여 쿼리하려면 여러 개의 procs를 정의하고 각각을 async/await로 직접 호출하십시오. –

답변

1

QueryMultiple은 입력이 아니라 결과입니다. 당신이 원하는 것을하기 위해서, 당신은 많은 시간을 SP에게 전화해야합니다. 당신이 할 수있는 하나 간단한 foreach 루프 자신, 또는를 통해 (모든) 많은 예를 들어, 가장 바깥 쪽 객체로서 IEnumerable<T> 전달하여 편리한 방법을 허용 할 말끔 방법 :

int[] ids = ... 
var args = ids.Select(id => new { id, val = "ABC" }); 
db.Execute("whatever", args); 

실행됩니다 각 항목에 대해 한 번 씩 SQL은 @id@val을 전달합니다. async API의 경우 MARS와 결합하여 호출간에 지연 시간을 없앨 수 있지만 MARS가 기본 옵션이 아니기 때문에이 옵션을 사용합니다.

또는 단일 매개 변수를 사용하여 새 래퍼 SP를 작성한 다음 (새 string_split이 이상적 일 수 있음) 서버에서 루프를 수행 할 수 있습니다.

+0

여러 매개 변수에 대해 동일한 SP를 호출하는 것은 확실히 프로 성능 접근법입니다. TVP를 통과시키는 것이 좋습니다. 각 행은 주어진 출력에 대한 매개 변수의 조합이며, 문자열 구문 분석을 수행 할 필요가 없습니다. 제안 된 –