6

PetaPoco以实验形式引入了 Multi-POCO 查询(目前)。正如他们的博客文章所建议的那样,当我们每行加载多个 POCO 时,它提供的代码看起来不错,而且都是一对一的关系,只要它们不在记录上重复。

当至少一侧是关系时会发生什么?实际上示例代码是多对一的关系数据。

示例代码显然是多对一关系。我没有测试任何 PetaPoco 代码,但博文中提供的代码有什么作用?每个Article人都有自己的User对象实例,即使有些可能是同一个用户,还是他们共享同一个用户对象实例?

那么其他许多关系类型呢?他们是如何工作的?

4

3 回答 3

8

通常我自己映射这些一对多查询,如下例所示。

[TableName("Blogs"), PrimaryKey("BlogId")]
public class Blog {
    public int BlogId {get;set;}
    public string Title {get;set;}

    [Ignore]
    public IList<Post> Posts {get;set;}
}

[TableName("Posts"), PrimaryKey("PostId")]
public class Post {
    public int PostId {get;set;}
    public int BlogId {get;set;}
    public string Subject {get;set;}
    public string Content {get;set;}
}

public class FlatBlogPost {
    public int BlogId {get;set;}
    public string Title {get;set;}
    public int PostId {get;set;}
    public string Subject {get;set;}
    public string Content {get;set;}
}

有两种方法可以显示一个博客的帖子列表,或者无需太多工作,所有博客。

1.两个查询 -

var Blog = Db.Query<Blog>(1);  
var Posts = Db.Query<Post>("where BlogId = @0", 1);

2.一次查询=

var flat = Db.Query<FlatBlogPost>("select b.blogid, b.title, p.postid, p.subject, 
           p.content from blogs b inner join posts p on b.blogid = p.blogid where
           b.blogid = @0", 1);

var blog = flat
    .GroupBy(x=> new { x.BlogId, x.Title })
    .Select(x=> new Blog {
        BlogId = x.Key.BlogId,
        Title = x.Key.Title,
        Posts = x.Select(y=> new Post{
                    PostId = y.PostId,
                    BlogId = x.Key.BlogId,
                    Subject = y.Subject,
                    Content = y.Content
                }).ToList()
    });

但是通常在数字 2 中,我会直接从 FlatBlogPost 对象映射到我需要显示数据的视图模型。

更新
查看这些扩展 PetaPoco 以支持基本的一对多和多对一查询的帮助程序。schotime.net/blog/index.php/2011/08/21/petapoco-one-to-many-and-many-to-one/ https://schotime.wordpress.com/2011/08/21/petapoco-一对多和多对一/

于 2011-05-21T03:26:34.053 回答
2

我的 Petapoco 的“一对多”食谱如下。文档对我来说不够清楚。在 Linqpad 中创建一个 db 连接,它将显示您可以添加到生成的 Petapoco poco 类的所有导航属性。在 Linqpad 中执行相同的 SQL,以确保它获得您期望的数据。

// subclass the generated Parent table pocos, add navigation prop for children
[ResultColumn]  public List<DecoratedChild> Child { get; set; } 

// subclass the generated Child table pocos,  add navigation prop for parent  
[ResultColumn]  public DecoratedParent Parent { get; set; }      

// to get children with parent info
List<DecoratedChild> children = db.Fetch<DecoratedChild, DecoratedParent>(SELECT child.*, parent.* from ...)     

// to get children with parent info, using PetapocoRelationExtensions
List<Child> children = db.FetchManyToOne<Child, Parent>(child => child.ID, "select child.*, parent.* from ...

// to get parents with children info, using PetapocoRelationExtensions              
List<Parent> parents = db.FetchOneToMany<Parent, Child>(par => par.ID, child => child.ID != int.MinValue, "select parent.*, child.* from ...    

SQL 选择顺序很重要,与 Fetch 类型列表中的相同!!!导航道具将有父或子数据......有3个级别的调用将如下:

List<DecoratedGrandChild> grandChildColl = db.Fetch<DecoratedGrandChild, DecoratedChild, DecoratedParent>(SELECT grandch.* , child.*, parent.* from ...)
于 2017-11-22T06:20:30.817 回答
0

就个人而言,我认为您无法避免另一个数据库调用来获取评论。您可以通过使用 IN 子句获取 10 篇文章的所有评论列表(按照文章的存储顺序),并在进行循环时将它们添加到每个 article.comments 中,并且 comment.articleid 发生变化。我可以看到在单个 sql 调用中获取此信息的唯一方法是使用联接,但随后您将获得每个评论的重复文章详细信息,所以也许这不是 petapoco 的问题,只是其中之一永远不会完美

于 2011-05-24T13:29:09.447 回答