Использование списка целых чисел в запросе EF - либо перепишите запрос в форме, которая может быть переведена, либо переключитесь на оценку клиента.

Используя Entity Framework Core 3.1, у меня есть следующий запрос:

    var ids = new List<Int32> { 1, 2, 3 }; 

    users = context.Users

      .Where(x => ids.All(y => x.UserSkills.Any(z => y == z.SkillId)));

    var result = await users.ToListAsync();

Когда я запускаю этот запрос, я получаю следующую ошибку:

'The LINQ expression 'DbSet<User>
    .Where(u => True && __ids_0
        .All(y => DbSet<UserSkill>
            .Where(u0 => EF.Property<Nullable<int>>(u, "Id") != null && EF.Property<Nullable<int>>(u, "Id") == EF.Property<Nullable<int>>(u0, "UserId"))
            .Any(u0 => y == u0.SkillId)))' 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()

Как я могу это решить?


person Miguel Moura    schedule 27.03.2020    source источник


Ответы (1)


Ответ - ваше сообщение об ошибке:

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

Таким образом, команда linq усложняет структуру сущностей. Вам нужно написать более простую команду linq, например:

 var users = context.Users.Where(x => x.UserSkills.Any(z => 1 == z.SkillId)).ToListAsync;

Но это не то, что вам нужно. Таким образом, вы должны написать оператор кода для клиентской стороны, а не для базы данных.

Загрузите пользователей, а затем используйте свой код на стороне клиента.

person VK_ON_STACKOVERFLOW    schedule 27.03.2020