Jag tror att det är ganska säkert att göra jämförelsen som sträng, om du inte har år <1000 eller> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF översätter detta till ett SQL-predikat som
WHERE [alias].[stringYear] > @p
vilket är möjligt i SQL men inte i C#.
En fördel skulle vara att något index på stringYear
kan vara användbar i en genomförandeplan. Konverterar stringYear
till nummer eliminerar alla index.
Den här metoden är fortfarande användbar när strängkolumnen innehåller taggiga strängvärden. I ett sådant fall bör predikatet kombineras med Length. Till exempel för att hitta alla entiteter där en numerisk sträng som heltal är större än ett referensvärde
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Då kan frågemotorn inte använda index för längdjämförelsen men den kanske kan göra det för >
jämförelse.