6

PetaPocoは、マルチ POCO クエリを実験的な形で導入しました (今のところ)。彼らのブログ投稿とそれが提供するコードが示唆するように、これは見栄えがよく、レコードを繰り返さない限り、行ごとに複数の POCO をロードすると、すべてが1 対 1 の関係になります。

少なくとも一方が関係の場合はどうなりますか? 実際のサンプル コードは、多対 1 のリレーショナル データです。

サンプル コードは明らかに多対 1 の関係です。PetaPoco コードをテストしたことはありませんが、ブログ投稿で提供されているコードは何をしますか? 一部のユーザーが同じユーザーである場合や、同じユーザー オブジェクト インスタンスを共有している場合でも、すべてArticleが独自のオブジェクト インスタンスを持っていますか?User

では、他の多くの関係タイプはどうでしょうか? 彼らはどのように機能しますか?

4

3 に答える 3

8

通常、次の例のように、これらの 1 対多のクエリを自分でマップします。

[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 つのブログの投稿のリストを表示する方法と、あまり手間をかけずにすべてのブログを表示する方法は 2 つあります。

1.2 つのクエリ -

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

2.1 つのクエリ =

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 を拡張して基本的な 1 対多および多対 1 クエリをサポートするこれらのヘルパーを確認してください。https://schotime.wordpress.com/2011/08/21/petapoco- _一対多および多対一/

于 2011-05-21T03:26:34.053 に答える
2

Petapoco の「1 対多」レシピは以下のとおりです。ドキュメントは私にとって十分に明確ではありません。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 の選択順序は重要です。フェッチ タイプのリストと同じです !!! ナビゲーション小道具には親または子のデータがあります... 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 が変更されるようにすることができます。1 回の SQL 呼び出しでこの情報を取得する唯一の方法は、結合を使用することですが、各コメントに対して重複した記事の詳細を取得することになるため、おそらくこれは petapoco の問題ではなく、完璧にはならない

于 2011-05-24T13:29:09.447 に答える