我使用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 set
和count
,所以即使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:
- 创建PagingColumns类:
公共类PagingColumns{public int Id{get;set;}public int?TotalCount{get;set;}}
- 在查询中,添加这两列:
" -99 as Id, TotalCount = COUNT(1) OVER() "
- "Id";将伪造为在映射上拆分列
- TotalCount将为您提供查询的记录总数
- 在查询底部添加分页选项:
"ORDER BY OneOfYourTables.Id DESC OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY "
-
查询/映射时间:
PagingColumns pagingColumns; conn.Query<YourModelA, PagingColumns, YourModelA>(sql, (m, p) => { yourModelsList.Add(m); pagingColumns = p; return m; });
分页列现在将拥有总计数。
作为一种伎俩,你可以伪造";TotalCount";值,而实际上并不需要分页。