PetaPoco и отношения «многие к одному», «один ко многим» и «многие ко многим» - PullRequest
5 голосов
/ 20 мая 2011

PetaPoco представил запросы Multi-POCO в экспериментальной форме (на данный момент). Как показывает их запись в блоге , и код, который она предоставляет, выглядит красиво и все в отношениях один-к-одному , когда мы загружаем несколько POCO на строку, пока они не повторяются над записями.

Что происходит, когда хотя бы одна сторона имеет отношение много ? На самом деле пример кода: реляционные данные "многие к одному" .

Пример кода явно является отношением «многие к одному». Я не тестировал какой-либо код PetaPoco, но что делает предоставленный код в блоге? Каждый ли Article имеет свой собственный экземпляр объекта User, хотя некоторые из них могут быть одним и тем же пользователем, или они используют один и тот же экземпляр объекта пользователя?

А как насчет других Множество типов отношений? Как они работают или вообще работают?

Ответы [ 3 ]

7 голосов
/ 21 мая 2011

Обычно я сам сопоставляю эти запросы «один ко многим», как в следующем примере.

[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 «один ко многим и много ко одному» / https://schotime.wordpress.com/2011/08/21/petapoco-one-to-many-and-many-to-one/

1 голос
/ 22 ноября 2017

Мой рецепт "один ко многим" для Petapoco приведен ниже.Документы не достаточно понятны для меня.Создайте соединение db в Linqpad, оно покажет вам все свойства навигации, которые вы можете добавить к сгенерированным классам Petapoco poco.Выполните тот же SQL в Linqpad, чтобы убедиться, что он получает ожидаемые данные.

// 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 ...)
0 голосов
/ 24 мая 2011

Лично я не думаю, что вы можете избежать еще одного вызова базы данных, чтобы получить комментарии. Вы можете получить список всех комментариев для 10 статей (в том же порядке, в котором они хранятся), используя предложение IN, и пройтись по ним, добавляя их в каждый article.comments по мере продвижения и изменения comment.articleid. Единственный способ получить эту информацию в одном вызове sql - это использовать объединение, но тогда вы получите дубликаты деталей статьи для каждого комментария, так что, возможно, это не проблема с petapoco, просто одна из тех вещей, которые никогда не будет идеальным

...