Ich denke, es ist ziemlich sicher, den Vergleich als Zeichenfolge durchzuführen, es sei denn, Sie haben Jahre <1000 oder> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF übersetzt dies in ein SQL-Prädikat wie
WHERE [alias].[stringYear] > @p
was in SQL möglich ist, aber nicht in C#.
Ein Vorteil wäre, dass jeder Index auf stringYear
kann in einem Ausführungsplan verwendet werden. Konvertieren von stringYear
zu nummerieren eliminiert jeden Index.
Diese Methode ist immer noch nützlich, wenn die Zeichenfolgenspalte gezackte Zeichenfolgenwerte enthält. In einem solchen Fall sollte das Prädikat mit Länge kombiniert werden. Zum Beispiel, um alle Entitäten zu finden, bei denen eine beliebige numerische Zeichenfolge als Ganzzahl größer als ein Referenzwert ist
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Dann kann die Abfrage-Engine keine Indizes für den Längenvergleich verwenden, aber möglicherweise für den >
Vergleich.