Выражение LINQ не удалось перевести System.Version.Parse

Я использую EF и пытаюсь запросить некоторые записи, имеющие такой столбец версии:

      var servicesWhichExistInDifferentDataCenters = dbContext.CurrentRunningServices
    .Where(r => r.DeployedRing == ring 
        && r.DataCenter == defaultDataCenterIndex 
        && r.IsActive)
    .AsEnumerable()
    .Where(r => dbContext.CurrentRunningServices
        .Any(r2 => r2.DeployedRing == r.DeployedRing 
          && r2.DockerImageName == r.DockerImageName 
          && r2.DataCenter != r.DataCenter 
          && Version.Parse(r2.DeploymentVersion) != Version.Parse(r.DeploymentVersion)))
    .AsEnumerable()
    .ToList();

Выражение LINQ 'DbSet().Any(c => c.DeployedRing == __r_DeployedRing_0 && c.DockerImageName == __r_DockerImageName_1 && c.DataCenter != __r_DataCenter_2 && Version.Parse(c.DeploymentVersion) != __Parse_3)' не может быть переведено. Дополнительная информация: Не удалось выполнить перевод метода System.Version.Parse. Если этот метод можно сопоставить с вашей пользовательской функцией, см. https://go.microsoft.com/fwlink/?linkid=2132413 для получения дополнительной информации. Либо перепишите запрос в форме, которую можно перевести, либо явно переключитесь на оценку клиента, вставив вызов AsEnumerable, AsAsyncEnumerable, ToList или ToListAsync. Дополнительную информацию см. на https://go.microsoft.com/fwlink/?linkid=2101038 .

Запрос отлично выполняется локально в VS, но я получаю вышеуказанную ошибку при его запуске на сервере, хотя сервер просто запускает изображение, подготовленное из локального кода. Почему это происходит?

1 ответ

Version.Parse(r2.DeploymentVersion) != Version.Parse(r.DeploymentVersion)

Это сравнение нельзя «перевести» на SQL и запустить на сервере.

Вы можете вставить сюда еще один :

      dbContext.CurrentRunningServices.AsEnumerable().Any

который перенесет все данные и обработку на клиента.

ИЛИ

Вы можете просто пропустить анализ версий и сравнить строки на сервере базы данных, что позволит вам удалить все вашиs, которые, я думаю, нужны только для того, чтобы отладить/угадать решение вашей проблемы.

Если ваше поле версии не нормализовано, нормализуйте его перед помещением в базу данных, а не при каждом сравнении снова и снова.


Что касается того, почему этого не происходит, если вы запускаете его локально, я могу только предположить: может быть, вы используете не настоящий SQL-сервер локально, а своего рода базу данных в памяти? Многие из них используют ярлыки и фактически не переводят ваш оператор в SQL.

Другие вопросы по тегам