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.