C# 使用dapper进行分页的TotalCount

C# 使用dapper进行分页的TotalCount,c#,dapper,webapi2,C#,Dapper,Webapi2,我使用dapper将存储过程中的结果集获取到对象列表中,并将其作为json返回给客户端: public IHttpActionResult Test() { List<ProductPreview> gridLines; var cs = ConfigurationManager.ConnectionStrings["eordConnection"].ConnectionString; using (SqlConnection

我使用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);
    }
public IHttpActionResult测试()
{
列出网格线;
var cs=ConfigurationManager.ConnectionString[“eordConnection”].ConnectionString;
使用(SqlConnection conn=newsqlconnection(cs))
{
gridLines=conn.Query(“dbo.myStoredProcedure”,new{userID=1},
commandType:commandType.StoredProcess.ToList();
}
var totalCount=gridLines[0].MaxCount;//我需要知道总计数
....
返回Ok(网格线);
}
它起作用了。 ProductPreview类型的对象的最后一个属性是TotalCount,因为存储过程将total count作为每行的列返回。 (第二个选项是存储过程返回两个记录集,但我不确定如何将dapper更改为使用两个记录集)。拥有两个独立的查询不是一个选项

将gridLines json对象返回给客户机而不使用totalCount属性(因为它是开销)并将totalCount从存储过程读取到某个变量的最佳方法是什么? 将gridLines对象复制到没有totalCount属性的其他对象也会带来不必要的开销。

允许您在一个查询中处理多个结果网格

例如:

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();
   ...
} 
var sql=
@"
从CustomerId=@id的客户中选择*
从CustomerId=@id的订单中选择*
从CustomerId=@id”的返回中选择*;
使用(var multi=connection.QueryMultiple(sql,new{id=selectedId}))
{
var customer=multi.Read().Single();
var orders=multi.Read().ToList();
var返回=multi.Read().ToList();
...
} 

您可能希望以不同的方式处理此问题,因为要求获得
结果集和
计数,因此即使
QueryMultiple
有帮助,但这最好用于
多个结果集
,在这种情况下,您可以计划使用
动态参数
,它可以帮助您添加
OutputParameter
,而不仅仅是
InputParameter
,就像您在默认情况下使用
匿名类型
和执行
conn.Query
时所做的那样,这将有助于接收类型为
IEnumerable
的结果集,可以使用代码获取输出参数值以获取下面所示的计数:

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);
    }
public IHttpActionResult测试()
{
列出网格线;
var cs=ConfigurationManager.ConnectionString[“eordConnection”].ConnectionString;
使用(SqlConnection conn=newsqlconnection(cs))
{
DynamicParameters DynamicParameters=新的DynamicParameters();
dynamicParameters.Add(“UserID”,1,ParameterDirection.Input);
//在此参数中填写计数
dynamicParameters.Add(“Count”,0,ParameterDirection.Output);
gridLines=conn.Query(“dbo.mystoredprocesdure”),dynamicParameters,
commandType:commandType.StoredProcess.ToList();
var totalCount=dynamicParameters.Get(“Count”);
}
....
返回Ok(网格线);
}

谢谢。这两种解决方案都有效。这个听起来更合适。