Выражение 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
который перенесет все данные и обработку на клиента.
ИЛИ
Вы можете просто пропустить анализ версий и сравнить строки на сервере базы данных, что позволит вам удалить все ваши
Если ваше поле версии не нормализовано, нормализуйте его перед помещением в базу данных, а не при каждом сравнении снова и снова.
Что касается того, почему этого не происходит, если вы запускаете его локально, я могу только предположить: может быть, вы используете не настоящий SQL-сервер локально, а своего рода базу данных в памяти? Многие из них используют ярлыки и фактически не переводят ваш оператор в SQL.