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次……这有关系吗?

是否有一种方法可以更快地加载这些数据?我是不是漏掉了什么技巧?

PetaPoco一对多映射性能

考虑到一次使用多个作者的情况很少见,我只会使用以下格式获取所需作者的文章:

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