PetaPoco一对多映射性能
本文关键字:性能 映射 一对多 PetaPoco | 更新日期: 2023-09-27 18:10:45
查看PetaPoco帮助部分给出的示例- "一对多关系"部分
它描述了如何使用InnerJoin和mapper来处理一对多关系的数据映射…
var authors = db.Fetch<author, post, author>(
new AuthorPostRelator().MapIt,
"SELECT * FROM authors LEFT JOIN posts ON posts.author = authors.id ORDER BY posts.id"
);
这对于小的表来说很好,但是对于大量的数据,这个数据的加载非常慢。
这不是一个"作者",而是为了保持语言的一致性…
我的作者有30个专栏。我有90000个作者,每个作者有50篇文章。
上面的查询将删除4,500,000行数据…在该数据中,作者行重复了50次……这有关系吗?
是否有一种方法可以更快地加载这些数据?我是不是漏掉了什么技巧?
考虑到一次使用多个作者的情况很少见,我只会使用以下格式获取所需作者的文章:
var author = db.SingleOrDefault<Author>("WHERE id= @0", authorId);
if (author != null)
{
var posts= _db.Query<Post>("WHERE Id = @0 ", author.Id).ToList();
author.Posts.AddRange(posts);
}
return author;
这样我避免了左连接和获取所需的作者帖子,而没有任何性能损失。
通过这种方式,您甚至可以通过在posts where子句中添加更多条件来限制返回的帖子:
var posts= _db.Query<Post>("WHERE Id = @0 AND Cond1 = @1", author.Id, cond1).ToList();
您甚至可以通过定义所需列的模型并替换
来限制从作者返回的列的数量var author = db.SingleOrDefault<Author>("WHERE id= @0", authorId);
var author = db.SingleOrDefault<AuthorModel>("WHERE id= @0", authorId);