Acho bastante seguro fazer a comparação como string, a menos que você tenha anos <1000 ou> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF traduz isso em um predicado SQL como
WHERE [alias].[stringYear] > @p
o que é possível em SQL, mas não em C#.
Uma vantagem seria que qualquer índice em
stringYear
pode ser usado em um plano de execução. Convertendo stringYear
to number elimina qualquer índice. Esse método ainda é útil quando a coluna de string contém valores de string irregulares. Nesse caso, o predicado deve ser combinado com Comprimento. Por exemplo, para encontrar todas as entidades onde qualquer string numérica como inteiro é maior que algum valor de referência
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Então, o mecanismo de consulta não pode usar índices para a comparação de comprimento, mas pode fazê-lo para o
>
comparação.