Myslím, že je docela bezpečné provést srovnání jako řetězec, pokud nemáte roky <1000 nebo> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF to převede na predikát SQL jako
WHERE [alias].[stringYear] > @p
což je možné v SQL, ale ne v C#.
Výhodou by bylo, že jakýkoli index na stringYear
mohou být použitelné v prováděcím plánu. Převádí se stringYear
to number eliminuje jakýkoli index.
Tato metoda je stále užitečná, když sloupec řetězce obsahuje zubaté hodnoty řetězce. V takovém případě by měl být predikát kombinován s délkou. Chcete-li například najít všechny entity, kde je jakýkoli číselný řetězec jako celé číslo větší než nějaká referenční hodnota
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Dotazovací modul pak nemůže použít indexy pro porovnání délky, ale může to udělat pro >
srovnání.