userSkills
- это коллекция в памяти, и, исходя из моего опыта работы с EF6 и EF Core, я могу сказать, что единственная надежная переводимая конструкция с коллекциями в памяти - это Enumerable.Contains
метод для коллекции в памяти примитивного типа.
Таким образом, следующая проблема решает вопрос.
Сначала (должно быть вне дерева выражений запроса):
var userSkillIds = user.UserSkills.Select(x => x.SkillId);
Затем вместо
.Where(x => x.LessonSkills.All(y => userSkills.Any(z => y.SkillId == z.SkillId)))
используйте эквивалент (но можно перевести):
.Where(x => x.LessonSkills.All(y => userSkillIds.Contains(y.SkillId)))
Обновление: Если вы не можете использовать Contains
, у вас есть варианты, пока EF Core не начнет их поддерживать (1) пакет EntityFrameworkCore.MemoryJoin (лично я его не тестировал, но идея интересная), (2) создание вручную предиката на основе Or
с классом Expression
(сложно и работает для небольшой памяти)коллекций) и (3) замените коллекцию памяти действительными IQueryable<>
, например
var userSkills = users
.Where(x => x.Id == 1)
.SelectMany(x => x.UserSkills);
и используйте исходный запрос.