Guardando l'esempio dato su Sezione di aiuto di PetaPoco - sezione "Relazioni uno-a-molti"
Descrive come usare InnerJoin e un mapper per gestire la mappatura dei dati di una relazione uno-a-molti ...
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"
);
Questo va bene per le piccole tabelle, ma per grandi quantità di dati, il caricamento di questi dati è molto lento.
Non è un "autore", ma per mantenere la stessa lingua ...
Il mio autore ha 30 colonne. Ho 90.000 autori e ogni autore ha 50 post.
Quella query sopra farà cadere 4.500.000 righe di dati ... in quei dati le righe dell'autore sono duplicate 50 volte ... è importante?
C'è un modo per caricare in questi dati più velocemente? Ho perso un trucco ovunque lungo la linea?
risposte:
0 per risposta № 1Tenendo presente che è raro lavorare con più di un autore alla volta, vorrei recuperare solo i post per un autore richiesto utilizzando il seguente formato:
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;
In questo modo evito il join sinistro e recupero i post degli autori richiesti senza penalizzazioni prestazionali.
In questo modo puoi anche limitare i post restituiti aggiungendo più condizioni nella clausola posts where nel modo seguente:
var posts= _db.Query<Post>("WHERE Id = @0 AND Cond1 = @1", author.Id, cond1).ToList();
Puoi anche limitare il numero di colonne restituite dall'autore definendo un modello delle colonne richieste e sostituendolo
var author = db.SingleOrDefault<Author>("WHERE id= @0", authorId);
con
var author = db.SingleOrDefault<AuthorModel>("WHERE id= @0", authorId);