Creo que es bastante seguro hacer la comparación como una cadena, a menos que tenga años <1000 o> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF traduce esto a un predicado SQL como
WHERE [alias].[stringYear] > @p
lo cual es posible en SQL pero no en C#.
Una ventaja sería que cualquier índice en stringYear
puede ser utilizable en un plan de ejecución. Convirtiendo stringYear
al número elimina cualquier índice.
Este método sigue siendo útil cuando la columna de cadena contiene valores de cadena irregulares. En tal caso, el predicado debe combinarse con Longitud. Por ejemplo, para encontrar todas las entidades donde cualquier cadena numérica como un entero es mayor que algún valor de referencia
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Entonces, el motor de consulta no puede usar índices para la comparación de longitud, pero podría hacerlo para el >
comparación.