Ciao,
ti ho chiesto del virtual per avere conferma del Lazy loading di entity framework...confermato il virtual è confermato che l'errore di questa mattina dipende dal lazy loading e dal fatto che veniva eseguita contemporaneamente più di una query al database (dubbio sollevato anche da Moreno)
Per risolvere il problema utilizziamo Eager Loading (metodo Include)...se vuoi approfondire le modalità di caricamento delle entità correlate in ef guarda
Loading Related Entities (oppure cerca qui sul sito, ci sono diversi contenuti scritti da Stefano Mostarda)
Adesso...per risponderti in tempi brevi...puoi fare questo
public class BarcaplanningDTO
{
// ... altre proprietà
public string Imbarcostring => string.Join(",", Imbarco);
}
var query = await _db.ListEventiBarche
.Where(r => r.Evento.Event_date.Month == mese || r.Evento.Event_end_date.Month == mese)
.Include(x => x.Barca)
.Include(x => x.Imbarco)
.Include(x => x.Evento)
.GroupBy(r => r.Barca.BarcaID)
.Select(r => new BarcaplanningDTO
{
BarcaID = r.Key,
Titolo = r.Select(x => x.Evento.Title).ToList(),
Modello = r.Select(x => x.Barca.Modello).FirstOrDefault(),
Nome = r.Select(x => x.Barca.Nome).FirstOrDefault(),
Regione = r.Select(x => x.Barca.Regione).FirstOrDefault(),
Letti = r.Select(x => x.Barca.Letti).FirstOrDefault(),
Imbarco = r.Select(x => x.Imbarco.Nome).ToList(),
Occupata = r.Select(x => 3).ToList(),
Ordine = 3,
Dateint = r.Select(x => new Intervallodate { EventoID = x.EventoID, Event_date = x.Evento.Event_date, Event_end_date = x.Evento.Event_end_date }).ToList()
}).ToListAsync();
Ti riporto i consigli di questa mattina
A livello generale due consigli a livello di performance
- verificare sempre (e capire realmente) come una query linq si traduce nella richiesta/e (non sempre è vero il rapporto 1:1) al database e per fare questo puoi guardare qui
- in questo caso quando disponibile meglio utilizzare la variante asincrona, await _db.ListEventiBarche....ToListAsync()
sono ancora validi, ma per il primo punto utilizza il link che ti ha segnalato Moreno...il codice da scrivere e davvero poco ma la pagina che ti ha segnalato è più esaustiva
Verifica il numero di query che vengono eseguite sul database (per la prova che ho fatto prima presumo una)
Anche se viene inviata una sola query non è detto che sia una buona soluzione, verifica il piano di esecuzione...a volte è meglio scomporre l'esigenza ed inviare più query o cambiare completamente metodo ed al posto di gestire il tutto lato codice si può risolvere con una store procedure per es
/Ciao