Ho un pezzo di codice che sto cercando di trasferire da EF6 a EF core (in un progetto RTM core 1.0 di ASP.NET). Filtra la tabella dei pazienti per tutti i pazienti con un datetime tra il "Verpleegperiode" startdate e enddate e per esempio con un "Verpleegperiode" nell'anno 2015. (Ho usato questo nel mio progetto EF6 per creare filtri dinamici aggiungendo clausole Where al Oggetto IQueryable, per filtrare il nome, la data di nascita e questo tipo di filtri)
Il codice:
var datetime = DateTime.Parse("5/7/2015");
var patients = _context.Patienten.Include(p => p.Dossiers).ThenInclude(d => d.DossierContact).ThenInclude(dc => dc.Verpleegperiodes)
.Where(p =>
p.Dossiers.Any(d =>
d.DossierContact.Verpleegperiodes.Any(vp =>
(!vp.BeginDatumUur.HasValue || vp.BeginDatumUur.Value <= datetime) &&
(!vp.BeginDatumUur.HasValue || vp.EindDatumUur >= datetime))
))
.Where(p =>
p.Dossiers.Any(d => d.DossierContact == null ||
d.DossierContact.Verpleegperiodes.Any(vp =>
!vp.BeginDatumUur.HasValue || vp.BeginDatumUur.Value.Year.ToString() == "2015")
)).ToList();
Ciò si traduce in una query chiamata per ogni "Verpleegperiode" in ogni "DossierContact" del "Dossier". Poiché ci sono oltre 50000 record in ogni tabella, questo continua e non finisce mai la query (probabilmente ci vogliono ore ...)
In EF6, questo ha generato una query con entrambe le clausole Where in 1 e utilizzando join e sottoquery creati automaticamente da EF6 e funzionanti.
Non sono sicuro che questo sia qualcosa che non è finito nel core EF, o che questo è un difetto nel mio codice, ed è per questo che chiedo questo su SO prima di presentare un bug sul progetto Github di EF core.
Relazioni definite in EF: Dossier paziente 1-a-molti, Dossier 1-to-one DossierContact, DossierContact 1-to-many Verpleegperiodes.
Entity Framework Core lavora un po 'di morso diverso dalle vecchie versioni. In passato la tua query sarà tradotta in un'unica grande query, ma con Core la query può essere suddivisa in sottoquery che non è una cattiva idea (una grande query con molti join è molto costosa su SQL Server).
Ci sono alcuni bug simili in github al tuo bug, ma hai ottenuto in forma più complicata. Nella tua query, l'EF Core impazzisce e si unisce totalmente in un modo inefficiente. La query di seguito indicata è chiamata XXXXXX volte, puoi verificarlo basta usare SQL Profiler o EF Profiler!
SELECT [vp3].[DateTime], [vp3].[PapierId]
FROM [SubPapiers] AS [vp3]
Spero che tali problemi saranno presto risolti o se riceverai un supporto dal team EF per pubblicare tutte le classi / entità nel caso.