Domanda

Petapoco ha introdotto query multi-Poco in forma sperimentale (per ora).Come Il loro post Blog suggerisce e il codice che fornisce questo sembra bello e tutto in one-to-one relazioni quando carichiamo Multi Pocos per riga finché non si ripetono sui record.

Cosa succede quando almeno un lato è molte relazione?In realtà il codice di esempio è molti-to-one dati relazionali.

Il codice di esempio è chiaramente una relazione molti-to-one.Non ho testato alcun codice PetapoCo, ma cosa fa il codice fornito sul post del blog?Ogni Article ha la propria istanza dell'oggetto User anche se alcuni potrebbero essere lo stesso utente o condividono la stessa istanza dell'oggetto utente?

e che dire degli altri tipi di relazioni molti ?Come funzionano affatto?

È stato utile?

Soluzione

Di solito mappano queste domande una-a-molti come il seguente esempio.

[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;}
}
.

Ci sono due modi in cui potrei visualizzare un elenco di post per un blog o senza troppi lavoro, tutti i blog.

1.Two Query -

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

2. Una query=

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()
    });
.

Comunque di solito in numero 2, mapperei direttamente dall'oggetto PlatBlogpost al mio mirino per il quale ho bisogno di visualizzare i dati.

Aggiornamento
Dai un'occhiata a questi aiutanti che prolungano Petapoco per supportare query di base one-to-molti e molte a uno. schotime.net/blog/index.php/2011/08/21/PetAPOCO-ONE-O-MANY-AND-MANY-TO-ONE / https://schotime.wordpress.com/2011/08/21/PETPOCOCO-Un-to-molti-e-molti-a-one /

Altri suggerimenti

La mia "one to molti" riceve per Petapoco è inferiore.I documenti non sono abbastanza chiari per me.Creare una connessione DB in Linqpad, ti mostrerà tutte le proprietà di navigazione che puoi aggiungere alle classi petapoco Poco generate.Esegui lo stesso SQL in Linqpad, per assicurarti che ottiene i dati che ti aspetti.

// 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 Seleziona ordine Importante, come nella lista dei tipi di recupero !!! I puntelli di navigazione avranno dati genitori o bambini ... Con 3 livelli la chiamata sarà come:

List<DecoratedGrandChild> grandChildColl = db.Fetch<DecoratedGrandChild, DecoratedChild, DecoratedParent>(SELECT grandch.* , child.*, parent.* from ...)
.

Personalmente non penso che tu possa evitare un'altra chiamata di database per ottenere i commenti.È possibile ottenere un elenco di tutti i commenti per i 10 articoli (nello stesso ordine gli articoli sono memorizzati) utilizzando una clausola nella clausola e loop attraverso di essi aggiungendoli a ciascun articolo.Comment mentre vai avanti e il commento.Articled.L'unico modo in cui posso vedere in procinto di ottenere queste informazioni in una singola chiamata SQL sarebbe quella di utilizzare un join, ma allora avresti duplicato i dettagli dell'articolo duplicati per ogni commento, quindi forse questo non è un problema con PETAPOCO, solo una di quelle cose cheNon sarà mai perfetto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top