Ik denk dat het vrij veilig is om de vergelijking als string te doen, tenzij je jaren <1000 of> 9999 hebt:
... dr.stringYear.CompareTo(myNumberString) > 0
EF vertaalt dit naar een SQL-predikaat zoals
WHERE [alias].[stringYear] > @p
wat mogelijk is in SQL maar niet in C#.
Een voordeel zou zijn dat elke index op stringYear
bruikbaar zijn in een uitvoeringsplan. stringYear
converteren naar nummer elimineert elke index.
Deze methode is nog steeds handig wanneer de tekenreekskolom gekartelde tekenreekswaarden bevat. In zo'n geval moet het predikaat worden gecombineerd met Lengte. Om bijvoorbeeld alle entiteiten te vinden waar een numerieke tekenreeks als geheel getal groter is dan een referentiewaarde
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Dan kan de query-engine geen indexen gebruiken voor de lengtevergelijking, maar wel voor de >
vergelijking.