使用Dapper进行分页的总记录数

4

我正在使用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属性的对象中也将是不必要的开销。

3个回答

5

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

3
你可能需要以不同的方式解决这个问题,因为要求获取一个“结果集”和一个“计数”,即使“QueryMultiple”有所帮助,但更适用于“多个结果集”。在这种情况下,你可以计划使用“动态参数”,它可以帮助你添加“输出参数”,而不仅仅是使用“匿名类型”默认添加“输入参数”,并通过执行“conn.Query<ProductPreview>”来接收类型为“IEnumerable<ProductPreview>”的结果集,并使用你的代码如下所示获取计数的输出参数值:
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);
    }

1

我发现了一个“还行”的方法来做到这一点,有点欺骗dapper:

  1. 创建一个PagingColumns类:

public class PagingColumns{public int Id { get; set; }public int? TotalCount {get;set;}}

  1. 在查询中添加这两列:

" -99 as Id, TotalCount = COUNT(1) OVER() "

  • “Id”将被伪造以分割映射列。
  • TotalCount将为您提供查询记录的总数。
  1. 在查询底部添加分页选项:

"ORDER BY OneOfYourTables.Id DESC OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY "

  1. Query/mapping time:

         PagingColumns pagingColumns;
         conn.Query<YourModelA, PagingColumns, YourModelA>(sql, (m, p) =>
         {
             yourModelsList.Add(m);
             pagingColumns = p;
             return m;
         });
    

PagingColumns现在将拥有您的totalCount

作为一个技巧,当不真正需要分页时,您可以伪造“TotalCount”值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接