gpt4 book ai didi

Dapper - 具有单个返回值的多映射

转载 作者:行者123 更新时间:2023-12-04 12:13:08 25 4
gpt4 key购买 nike

下面是我用来返回对象分页列表的代码:

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

尽管这有效,但这意味着我必须定义我的条件两次,一次用于计数查询,一次用于结果集查询。我可以只执行一个查询,而不是求助于字符串连接:
        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";

但是,我似乎无法使用 Dapper 进行映射。我不能使用与上面相同的方法,因为没有多个结果。我试过使用多映射,但这期望返回一个 IEnumerable。

我将如何映射到以下内容?
    public class PostList
{
public IEnumerable<PostModel> Posts;
public int TotalCount { get; set; }
}

谢谢

最佳答案

嗯……你不会……

你必须修改你的 PostModel 以包含一个 TotalCount 属性......这真的很难看。或者执行一个动态并在 Select 中重新映射它这也很丑。

你看,你用 count(*) over() 返回了 N 次 count(*) ...这是一个黑客,使用这个黑客不一定更快。在我的一些场景中,我测量它比运行双重查询慢,特别是你可以在 select count(*) 中快捷一些索引。因为您没有选择所有列。此外,hack 会禁用某些分页优化,例如您不能添加 select top N到查询。

我对分页查询的建议是正确建立索引,这是关键。测量性能,看看这个 hack 是否真的有帮助(当正确的索引到位时)。

我关注有关字符串连接的问题,但您始终可以为此定义通用的辅助方法。

关于Dapper - 具有单个返回值的多映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6214140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com