Ciao,
cioè fa il join senza fare il join...
Sono "proprietà di navigazione". E' una tecnica molto comune ed efficiente che devi assolutamente adottare al più presto. In Linq to Entities (Entity Framework), le join non si usano se non in casi limite.
non so se si è capito bene il mio problema
No :D perché hai scritto:
Non mi dilungo nella spiegazione perchè è difficile
quindi andrò a tentativi ma ci tengo comunque a spiegare la questione perché vedo che nei metodi getDaConsegnare e getNumConsegnati stai effettuando altre query LINQ che rendono il tutto inefficiente.
L'obiettivo è includere il tutto in una sola query LINQ. Le proprietà di navigazione aiutano in questo.
Per spiegare il concetto in maniera semplice, prendiamo due entità relazionate tra loro: Impiegato e Lavoro. Nota le proprietà di navigazione che legano le due entità.
public class Impiegato
{
public Impiegato()
{
Lavori = new HashSet<Lavoro>();
}
[Key]
public int IdImpiegato { get; set; }
public string Nome { get; set; }
public string Cognome { get; set; }
//Proprietà di navigazione che mi permette di accedere
//ai lavori assegnati a questo impiegato
public virtual ICollection<Lavoro> Lavori { get; set; }
}
public class Lavoro
{
public Lavoro()
{
Impiegati = new HashSet<Impiegato>();
}
[Key]
public int IdLavoro { get; set; }
public string Titolo { get; set; }
public bool Completato { get; set; }
//Proprietà di navigazione che mi permette di accedere
//agli impiegati che svolgono questo lavoro
public virtual ICollection<Impiegato> Impiegati { get; set; }
}
Un impiegato può svolgere più lavori contemporaneamente, come è tipico in Italia. Quindi mappo la relazione molti a molti nel DbContext. Nota che non ho bisogno di alcuna entità di raccordo. Ho solo Impiegati e Lavori.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Per brevità ometto i nomi di colonne e tabelle coinvolte
modelBuilder
.Entity<Impiegato>()
.HasMany(impiegato => impiegato.Lavori)
.WithMany(lavoro => lavoro.Impiegati);
}
Adesso posso fare una sola query LINQ che mi permette di ottenere il nome dell'impiegato e il numero dei lavori completati e totali a cui è stato assegnato. Nessuna join necessaria. Nessun passaggio di id necessario.
var situazione = db.Impiegati.Select(impiegato => new {
impiegato.Nome,
impiegato.Cognome,
LavoriInCorso = impiegato.Lavori.Where(l => !l.Completato).Count(),
LavoriTotali = impiegato.Lavori.Count()
});
ciao,
Moreno
Modificato da BrightSoul il 13 luglio 2016 20.02 -