Jeg tror, det er ret sikkert at lave sammenligningen som streng, medmindre du har år <1000 eller> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF oversætter dette til et SQL-prædikat som
WHERE [alias].[stringYear] > @p
hvilket er muligt i SQL, men ikke i C#.
En fordel ville være, at ethvert indeks på stringYear
kan bruges i en udførelsesplan. Konvertering af stringYear
til nummer eliminerer ethvert indeks.
Denne metode er stadig nyttig, når strengkolonnen indeholder takkede strengværdier. I et sådant tilfælde bør prædikatet kombineres med længde. For eksempel at finde alle enheder, hvor en numerisk streng som heltal er større end en referenceværdi
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Så kan forespørgselsmotoren ikke bruge indekser til længdesammenligningen, men den kan muligvis gøre det for >
sammenligning.