더퍼와 함께 페이징하는 TotalCount

c# dapper webapi2

문제

나는 dapper를 사용하여 저장 프로 시저에서 객체 목록으로 결과 집합을 가져 와서 json으로 클라이언트에 반환합니다.

public IHttpActionResult Test()
    {
        List<ProductPreview> gridLines;
        var cs = ConfigurationManager.ConnectionStrings["eordConnection"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(cs))
        {
            gridLines = conn.Query<ProductPreview>("dbo.myStoredProcedure", new { userID = 1 },
             commandType: CommandType.StoredProcedure).ToList();
        }
        var totalCount = gridLines[0].MaxCount;//I need to know total count
        ....
        return Ok(gridLines);
    }

그것은 작동합니다. ProductPreview 유형의 객체의 마지막 속성은 TotalCount입니다. 저장 프로 시저가 모든 행의 열로 총 개수를 반환하기 때문입니다. 두 번째 옵션은 저장 프로 시저가 두 개의 레코드 세트를 반환하지만 두 개의 레코드 세트로 작동하도록 dapper를 변경하는 방법을 잘 모르겠습니다. 두 개의 별도 쿼리를 갖는 것은 옵션이 아닙니다.

totalCount 속성을 사용하지 않고 gridLines json 객체를 클라이언트에 반환하는 가장 좋은 방법은 무엇입니까 (오버 헤드가 있으므로). 저장 프로 시저에서 일부 변수까지 총 개수를 읽으시겠습니까? totalCount 속성이없는 다른 객체에 gridLines 객체를 복사하면 불필요한 오버 헤드가 발생합니다.

수락 된 답변

Result set count 를 얻는 것이기 때문에 QueryMultiple 도움이되지만 multiple result setsQueryMultiple 사용되기 때문에이 문제에 다르게 접근 할 수 있습니다.이 경우에는 Dynamic Parameters 를 사용하려고 계획 할 수 있습니다. Anonymous type 을 사용하여 기본적으로 수행 한 것처럼 InputParameter 뿐만 아니라 conn.Query<ProductPreview> 를 실행하면 OutputParameter 를 추가 할 수 있습니다.이 특성은 IEnumerable<ProductPreview> 형식의 결과 집합을받는 데 도움이됩니다. 출력 매개 변수 값을 사용하여 아래 코드와 같이 Count를 가져옵니다.

public IHttpActionResult Test()
    {
        List<ProductPreview> gridLines;
        var cs = ConfigurationManager.ConnectionStrings["eordConnection"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(cs))
        {
            DynamicParameters dynamicParameters = new DynamicParameters();

            dynamicParameters.Add("UserID",1,ParameterDirection.Input);

            // Fill the Count in this Parameter
            dynamicParameters.Add("Count",0,ParameterDirection.Output); 

            gridLines = conn.Query<ProductPreview>("dbo.myStoredProcedure", dynamicParameters,
             commandType: CommandType.StoredProcedure).ToList();

             var totalCount = dynamicParameters.Get<int>("Count");
        }

        ....
        return Ok(gridLines);
    }

인기 답변

Dapper를 사용하면 단일 쿼리에서 여러 결과 격자를 처리 할 수 ​​있습니다.

예:

var sql = 
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";

using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...
} 


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow