Мисля, че е доста безопасно да направите сравнението като низ, освен ако нямате години <1000 или> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF превежда това в SQL предикат като
WHERE [alias].[stringYear] > @p
което е възможно в SQL, но не и в C#.
Предимство би било всеки индекс на stringYear
може да се използва в план за изпълнение. Преобразуване на stringYear
към номер елиминира всеки индекс.
Този метод все още е полезен, когато колоната с низ съдържа назъбени стойности на низ. В такъв случай предикатът трябва да се комбинира с Length. Например, за да намерите всички обекти, където всеки числов низ като цяло число е по-голям от някаква референтна стойност
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Тогава машината за заявки не може да използва индекси за сравнение на дължината, но може да е в състояние да го направи за >
сравнение.