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 属性的其他对象也是不必要的开销。

4

3 回答 3

4

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();
   ...
} 
于 2016-03-29T16:05:34.250 回答
3

您可能希望以不同的方式处理此问题,因为要求是获得 aResult set和 a count,然后即使有QueryMultiple帮助,但最好用于multiple result sets,在这种情况下,您可以计划使用,Dynamic Parameters这可以帮助您添加正如您OutputParameterInputParameter默认情况下使用Anonymous type和执行的那样conn.Query<ProductPreview>,这将有助于接收类型的结果集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);
    }
于 2016-03-30T07:53:35.380 回答
1

我找到了一种“好的”方法来做到这一点,稍微欺骗了一些小巧玲珑:

  1. 创建一个 PagingColumns 类:

公共类 PagingColumns{public int Id { 获取;放; }公共整数?TotalCount {get;set;}}

  1. 在您的查询中,添加这 2 列:

" -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;
         });
    

PagingColumns现在将拥有您的totalCount

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

于 2021-10-07T11:45:57.820 回答