LINQ: weiteres Filtern einer Query funktioniert nicht mit DTO

Problem: eine Personenabfrage soll je nach mitgegebenen Parametern weiter gefiltert werden. Vorher sah das ganze etwa so aus:

var pers = (
	from person
	in _context.Personen
	select new PersonSucheDTO(
		person.PersonId,
		person.Familienname,
		person.Vorname,
		person.AbteilungId
	)
);

if (abteilungenIds != null && abteilungenIds.Length > 0) 
	pers = pers.Where(p => abteilungenIds.Contains(p.AbteilungId));

return await Task.FromResult(Ok(pers));

Aber seit dem Einbau einer DTO failed die Abfrage, und es gibt eine Fehlermeldung dieser Art:

The LINQ expression ‚…‘ could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().

Stellt sich raus, wenn man die Ergebnisse direkt in den Konstruktor der DTO übergibt, dann muss die Query direkt ausgeführt werden und die Filterung nach AbteilungsIds erfolgt dann erst nachträglich und nicht über die Datenbankabfrage. Daher die Lösung:

var pers = (
     from person
     in _context.Personen
     select new PersonSucheDTO()
     {
         PersonId = person.PersonId,
         Name = person.Familienname,
         Vorname = person.Vorname,
         AbteilungId = person.AbteilungId
     }
 );

if (abteilungenIds != null && abteilungenIds.Length > 0)
pers = pers.Where(p => abteilungenIds.Contains(p.AbteilungId));

return await Task.FromResult(Ok(pers));

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.