Использование списка целых в запросе EF - либо переписать запрос в форме, которую можно перевести, либо переключиться на оценку клиента - PullRequest
0 голосов
/ 27 марта 2020

Используя 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()

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

1 Ответ

0 голосов
/ 28 марта 2020

Ответом является ваше сообщение об ошибке:

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;

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

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

...