A continuación se muestra el código que estoy usando para devolver una lista paginada de objetos:Dapper - Mapeo de múltiples con un único valor de retorno
string query2 = @"
select count(*) as TotalCount from blogposts p where p.Deleted = 0 and p.PublishDate <= @date
select * from (
select p.*,
row_number() over(order by publishdate desc) as rownum
from blogposts as p
where p.Deleted = 0 and p.PublishDate <= @date
) seq
where seq.rownum between @x and @y";
using (var cn = new SqlConnection(connectionString))
{
cn.Open();
using (var multi = cn.QueryMultiple(query2, new { x= lower, y = upper, date = DateTime.UtcNow }))
{
var totalCount = multi.Read<int>().Single();
var posts = multi.Read<PostModel>().ToList();
return new PagedList<PostModel>(posts, page, pageSize, x => totalCount);
}
}
Aunque esto funciona, significa que tengo que definir mi criterio dos veces, una vez para la consulta de conteo y una para la consulta de conjunto de resultados. En lugar de recurrir a la concatenación de cadenas, puedo ejecutar una sola consulta:
string query = @"
select * from (select p.*,
row_number() over(order by publishdate desc) as rownum,
count(*) over() as TotalCount
from blogposts as p) seq
where seq.rownum between @x and @y";
Sin embargo, no parecen capaces de trazar esta usando Dapper. No puedo usar el mismo método que el anterior porque no hay resultados múltiples. Intenté usar el mapeo múltiple, pero esto espera devolver un IEnumerable.
¿Cómo me asignaría a lo siguiente?
public class PostList
{
public IEnumerable<PostModel> Posts;
public int TotalCount { get; set; }
}
Gracias
Ben
Gracias por los comentarios. Creo que me quedaré con la doble consulta y construiré algunos ayudantes para mantener las cosas secas. –