Да, приведение к Nullable of T является рекомендуемым способом решения проблемы в запросах LINQ to Entities.Наличие метода MaxOrDefault (), который имеет правильную сигнатуру, звучит как интересная идея, но вам просто потребуется дополнительная версия для каждого метода, представляющего эту проблему, которая не очень хорошо масштабируется.
Это одно из многих несоответствий между тем, как вещи работают в CLR, и тем, как они работают на сервере базы данных.Подпись метода Max () была определена таким образом, поскольку ожидается, что тип результата будет точно таким же, как тип ввода в CLR.Но на сервере базы данных результат может быть нулевым.По этой причине вам необходимо преобразовать входные данные (хотя в зависимости от того, как вы пишете свой запрос, этого может быть достаточно для преобразования выходных данных) в Nullable of T.
Вот решение, которое выглядит несколько проще, чему вас есть выше:
var version = ctx.Entries
.Where(e => e.Competition.CompetitionId == storeCompetition.CompetitionId)
.Max(e =>(int?)e.Version);
Надеюсь, это поможет.