Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Conversion de chaîne en int dans linq en entités sur une grande base de données

Je pense qu'il est assez sûr de faire la comparaison sous forme de chaîne, sauf si vous avez des années <1000 ou> 9999 :

... dr.stringYear.CompareTo(myNumberString) > 0

EF traduit cela en un prédicat SQL comme

WHERE [alias].[stringYear] > @p

ce qui est possible en SQL mais pas en C#.

Un avantage serait que tout index sur stringYear peut être utilisable dans un plan d'exécution. Conversion de stringYear numéroter élimine tout index.

Cette méthode est toujours utile lorsque la colonne de chaîne contient des valeurs de chaîne irrégulières. Dans un tel cas, le prédicat doit être combiné avec la longueur. Par exemple, pour trouver toutes les entités où une chaîne numérique en tant qu'entier est supérieure à une valeur de référence

var len = myNumberString.Lenght;

var query = 
    from row in context.LegacyTable
    where row.NumericString.CompareTo(myNumberString) > 0
       && row.NumericString.Length >= len
    select row; 

Ensuite, le moteur de requête ne peut pas utiliser d'index pour la comparaison de longueur, mais il peut le faire pour le > comparaison.