PetaPoco一对多的映射性能

时间:2014-06-29 10:20:17

标签: c# petapoco

查看PetaPoco help section - 部分"一对多关系"

上给出的示例

它描述了如何使用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列。我有90,000位作者,每位作者有50个帖子。

上面的查询将减少4,500,000行数据......在该数据中,作者行重复了50次......这有关系吗?

有没有办法加快这些数据的加载速度?我是否在任何地方都错过了一个技巧?

1 个答案:

答案 0 :(得分:0)

请记住,一次与多位作者合作很少,我会使用以下格式仅为所需作者提取帖子:

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