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));