IsHighValueWork
- это простой C# метод. Невозможно преобразовать эту функцию в SQL с помощью EF.
Это действительно хорошо объяснено в этой ссылке , почему она работает. net ядро 2.1. Похоже, что в предыдущих версиях, когда EF Core не мог преобразовать выражение, которое было частью запроса, либо в SQL, либо в параметр, он автоматически вычислял выражение на клиенте.
И это действительно плохо. Потому что, как было отмечено:
Например, условие в вызове Where (), которое не может быть переведено, может привести к тому, что все строки таблицы будут перенесены с сервера базы данных, а фильтр - в быть примененным к клиенту.
Итак, ранее вы просто загружали все данные на клиент, а затем применяли фильтр на стороне клиента.
Итак, проблема с вашим код, который Func
не может быть переведен в Sql. Либо извлекайте все данные в приложение явным образом и затем фильтруйте, либо используйте вторую версию вашего кода.
Context.Work.ToList()
.Where( w => w.Type.IsHighValueWork());
Но я не рекомендую использовать эту версию. Лучше использовать вторую версию примерно так:
Func<Work, bool> IsHighValueWork = (work) =>
work.Type == WorkType.Type1 || work.Type == WorkType.Type2;
А потом:
var query = Context.Work.Where(IsHighValueWork);