1 Test ha assegnato 1 TestType.
Ho bisogno di caricare tutte le entità TestType in relazione a un Test OR e non a Schoolclass, Oggetto e Alunni assegnati a un test (PupilsTests)
Il .SelectMany o .Select fallisce qui durante il runtime.
Ho provato diverse combinazioni di Include e ThenInclude ma nessuna possibilità di ottenere i Test WITH the PupilsTests.
Posso solo ottenere gli PupilsTests con i test quando avvio la mia query con il context.Tests
ma questo ha la conseguenza che ottengo solo i TestTypes assegnati a un Test - innerjoin - ma ho bisogno di tutti i TestTypes e dei loro Test e dei loro PupilsTests e lo voglio in UNA query.
var testtypes = await context.TestTypes
.Include(x => x.Schoolclass)
.Include(x => x.Subject)
.Include(x => x.Tests.SelectMany(z => z.PupilsTests))
.Where(t => t.SchoolyearId == schoolyearId)
.AsNotTracking()
.ToListAsync();
public class TestType
{
public TestType()
{
Tests = new HashSet<Test>();
}
// Props removed for clarity
public int Id { get; set; }
public ISet<Test> Tests { get; set; }
public Schoolyear Schoolyear { get; set; }
public Schoolclass Schoolclass { get; set; }
public Subject Subject { get; set; }
public int SchoolyearId { get; set; }
}
public class Test
{
public Test()
{
PupilsTests = new HashSet<PupilTest>();
}
// Props removed for clarity
public int Id { get; set; }
public ISet<PupilTest> PupilsTests { get; set; }
public TestType TestType { get; set; }
}
La sintassi equivalente EF di EF6
.Include(x => x.Tests.SelectMany(z => z.PupilsTests))
è
.Include(x => x.Tests).ThenInclude(x => x.PupilsTests)
Si noti che sembra esserci un problema VS Intellisense all'interno di ThenInclude
, quindi basta digitare quanto sopra e verrà compilato correttamente e funzionerà.
Si noti inoltre che la raccolta dei processi EF Core include in modo diverso (non utilizza una singola query come in EF6), pertanto quanto sopra genererebbe ed eseguirà 3 query SQL.
Aggiornamento: il problema relativo a VS Intellisense è ora menzionato in modo specifico nella documentazione di EF Core nella sezione Includere più livelli :
Nota!
Le versioni correnti di Visual Studio offrono opzioni di completamento del codice errate e possono causare la
ThenInclude
espressioni corrette con errori di sintassi quando si utilizza il metodoThenInclude
dopo una proprietà di navigazione della raccolta. Questo è un sintomo di un bug IntelliSense tracciato su https://github.com/dotnet/roslyn/issues/8237 . È possibile ignorare questi errori di sintassi spuri purché il codice sia corretto e possa essere compilato correttamente.