使用适配器进行分页的TotalCount



我使用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,因为存储过程将total count作为每行的列返回。(第二种选择是存储过程返回两个记录集,但我不知道如何更改dapper以使用两个记录集中)。不能选择使用两个单独的查询。

在没有totalCount属性(因为这是开销)的情况下,向客户端返回gridLines-json对象并从存储过程中读取某个变量的totalCount的最佳方式是什么?将gridLines对象复制到没有totalCount属性的其他对象也是不必要的开销。

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

您可能希望以不同的方式处理此问题,因为要求是获得Result setcount,所以即使QueryMultiple有帮助,但它更好地用于multiple result sets,在这种情况下,您可以计划使用Dynamic Parameters,这可以帮助您添加OutputParameter,而不仅仅是InputParameter,因为您默认情况下使用Anonymous type和执行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);
    }

我发现了一个"ok";这样做的方法,稍微欺骗dapper:

  1. 创建PagingColumns类:

公共类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. 查询/映射时间:

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

分页列现在将拥有总计数

作为一种伎俩,你可以伪造";TotalCount";值,而实际上并不需要分页。

相关内容

  • 没有找到相关文章

最新更新