Я не понимаю эту ошибку.
Сообщение об ошибке, конечно, не является удобным для пользователя. Единственная релевантная часть -
. Это может указывать на ошибку или ограничение в EF Core.
, которое можно смело читать как "This это либо ошибка, либо ограничение в EF Core. "
Что происходит? Как вы теперь делаете «простые» объединения?
Вы можете делать «простые» объединения, но не присоединяются к памяти коллекциям. На самом деле присоединения к коллекциям памяти никогда не поддерживались. Просто EF Core 1.x / 2.x использовал так называемую оценку клиента для вещей, которые он не может перевести. Но неявная оценка клиента была удалена в 3.0 , и теперь вы должны либо найти переводимую конструкцию, либо явно переключиться на оценку клиента через LINQ to Objects (или System.Linq.Async
).
Поскольку переход к оценке клиента не является эффективным, особенно для объединений лучше найти / использовать переводимую конструкцию запроса. Если вы используете неэквивалентное или многоключевое соединение, у вас практически нет выбора. Но для равного соединения с одним ключом есть конструкция, которая поддерживается во всех версиях EF / EF Core, и это Enumerable.Contains
, что переводится как SQL IN (val1, val2, ..., valN)
.
Так что решение для вас конкретное дело будет примерно так:
userNames = userNames.Select(userName => userName.Trim().ToLower()).Distinct();
var personEmail = (
from person in personnelContext.Persons
where userNames.Contains(person.userName.Trim().ToLower())
// the rest of the query unchanged...