使用dapper进行分页的TotalCount

时间:2016-03-29 11:17:02

标签: 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对象返回给客户端的最佳方法是什么(因为它是开销)并从存储过程读取总计数到某个变量? 将gridLines对象复制到没有totalCount属性的其他对象也是不必要的开销。

2 个答案:

答案 0 :(得分:2)

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();
   ...
} 

答案 1 :(得分:2)

您可能希望以不同方式处理此问题,因为要求是获得Result setcount,然后即使QueryMultiple有帮助,但最好用于{{ 1}},在这种情况下,您可以计划使用multiple result sets,这可以帮助您添加Dynamic Parameters,而不仅仅是OutputParameter,因为您默认使用InputParameter并且在执行Anonymous type时,它将帮助接收类型conn.Query<ProductPreview>的结果集,可以获取输出参数值以获取Count,如下所示使用您的代码:

IEnumerable<ProductPreview>