Dapper - 具有單個返回值的多重映射

dapper

下面是我用來返回分頁對象列表的代碼:

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()返回count(*)N次...這是一個hack,使用這個hack不一定更快。我測量它比在某些場景中運行雙查詢慢,特別是你可以在select count(*)快捷一些索引,因為你沒有選擇所有的列。此外,hack禁用某些分頁優化,例如,您無法將select top N添加到查詢中。

我對分頁查詢的建議是獲得正確的索引,這是關鍵。測量perf並查看此hack是否真正有用(當正確的索引到位時)。

我關注字符串連接的問題,但您總是可以為此定義一般輔助方法。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因