/ / PetaPoco performance di mappatura uno-a-molti - c #, petapoco

Prestazioni di mappatura one-to-many PetaPoco - c #, petapoco

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 № 1

Tenendo 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);