EF Core 3.1.x: выражение LINQ не может быть переведено. Либо перепишите запрос в форме, которую можно перевести

EF Core 3.1.x:

Я бы не хотел загружать все продукты в память, как это делают нижеприведенные запросы! Угадайте, что произойдет, если у меня в таблице будут миллионы товаров?

var products = context.Products.ToList();
products = products.Where(p => p.Name.Contains("xxx")).ToList();

И ниже выдает запрос. Выражение LINQ «DbSet-Product- .Where (b => b.Name.Contains (value:« xxx », compareType: InvariantCultureIgnoreCase))» не может быть переведено. Либо перепишите запрос в форме, которая может быть переведена, либо явно переключитесь на оценку клиента, вставив вызов AsEnumerable (), AsAsyncEnumerable (), ToList () или ToListAsync ().

var products = context.Products.Where(p => p.Name.Contains("xxx", StringComparison.InvariantCultureIgnoreCase)).ToList();

Связанная проблема на github: # 19087

Может кто-нибудь мне помочь. как фильтровать данные с оценкой на стороне сервера с помощью ef core 3.1.x?


person Nimesh Vaghasiya    schedule 20.05.2020    source источник
comment
Пара замечаний: 1. EF core 3 никогда не переключается на оценку на стороне клиента, кроме случаев, когда это необходимо, при окончательном выборе запроса LINQ. 2. Ваш запрос не может вызвать это исключение. 3. Я не понимаю, как связана проблема с github. - Итак, действительно ли это EF core 3, и если да, публиковали ли вы точный запрос, генерирующий это исключение?   -  person Gert Arnold    schedule 20.05.2020
comment
Да, это запрос var products = context.Products.Where (p = ›p.Name.Contains (xxx)). ToList (); выдает ту же ошибку. Я использую Microsoft.EntityFrameworkCore, Version = 3.1.3.0. Для связанной проблемы на github: это такая же проблема, но построение с помощью выражения члена, которое я пытался, но выдает ту же ошибку.   -  person Nimesh Vaghasiya    schedule 20.05.2020
comment
Нет никакого способа, чтобы p.Name.Contains (xxx) можно было преобразовать в Name, например% xxx%, и перейти на сервер sql?   -  person Nimesh Vaghasiya    schedule 20.05.2020
comment
Какая это база данных? Это работает нормально с Sql Server (Microsoft.EntityFrameworkCore.SqlServer).   -  person Gert Arnold    schedule 20.05.2020
comment
Это SqlServer!   -  person Nimesh Vaghasiya    schedule 20.05.2020
comment
@GertArnold Вы правы, мой запрос содержит StringComparison.InvariantCultureIgnoreCase, который выдает ошибку. Только что обновленный запрос об ошибке, о котором идет речь.   -  person Nimesh Vaghasiya    schedule 20.05.2020


Ответы (1)


EF Core переводит Contains для оценки на стороне сервера, но не перегрузку, которая принимает StringComparison.InvariantCultureIgnoreCase (или любой другой StringComparison).

Закрытый вопрос здесь

person Nimesh Vaghasiya    schedule 20.05.2020