【问题标题】:Dapper - Multi Mapping with a single return valueDapper - 具有单个返回值的多重映射
【发布时间】:2011-09-07 00:48:42
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: dapper


    【解决方案1】:

    嗯……你不会……

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

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

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

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

    【讨论】:

    • 感谢您的反馈。我想我会坚持使用双重查询并构建一些帮助程序来保持干燥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多