sql >> Base de Datos >  >> RDS >> Sqlserver

Convertir cadena a int en linq a entidades en una gran base de datos

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.