Myślę, że całkiem bezpiecznie jest przeprowadzić porównanie jako ciąg znaków, chyba że masz lata <1000 lub> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF tłumaczy to na predykat SQL, taki jak
WHERE [alias].[stringYear] > @p
co jest możliwe w SQL, ale nie w C#.
Zaletą byłoby to, że każdy indeks w stringYear
może być wykorzystany w planie wykonania. Konwersja stringYear
numerowanie eliminuje wszelkie indeksy.
Ta metoda jest nadal przydatna, gdy kolumna ciągu zawiera postrzępione wartości ciągu. W takim przypadku predykat należy połączyć z parametrem Length. Na przykład, aby znaleźć wszystkie elementy, w których dowolny ciąg liczbowy jako liczba całkowita jest większy niż pewna wartość referencyjna
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Wtedy aparat zapytań nie może używać indeksów do porównania długości, ale może to zrobić dla >
porównanie.