Saya pikir cukup aman untuk melakukan perbandingan sebagai string, kecuali jika Anda memiliki tahun <1000 atau> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF menerjemahkan ini ke dalam predikat SQL seperti
WHERE [alias].[stringYear] > @p
yang mungkin dalam SQL tetapi tidak dalam C#.
Keuntungannya adalah indeks apa pun pada stringYear
dapat digunakan dalam rencana eksekusi. Mengonversi stringYear
ke nomor menghilangkan indeks apa pun.
Metode ini masih berguna ketika kolom string berisi nilai string bergerigi. Dalam kasus seperti itu predikat harus digabungkan dengan Panjang. Misalnya, untuk menemukan semua entitas di mana string numerik sebagai bilangan bulat lebih besar dari beberapa nilai referensi
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Kemudian mesin kueri tidak dapat menggunakan indeks untuk perbandingan panjang tetapi mungkin dapat melakukannya untuk >
perbandingan.