Penso che sia abbastanza sicuro fare il confronto come stringa, a meno che tu non abbia anni <1000 o> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF lo traduce in un predicato SQL come
WHERE [alias].[stringYear] > @p
che è possibile in SQL ma non in C#.
Un vantaggio sarebbe che qualsiasi indice su stringYear
può essere utilizzabile in un piano di esecuzione. Conversione di stringYear
numerare elimina qualsiasi indice.
Questo metodo è ancora utile quando la colonna della stringa contiene valori di stringa frastagliati. In tal caso il predicato dovrebbe essere combinato con Lunghezza. Ad esempio, per trovare tutte le entità in cui qualsiasi stringa numerica come intero è maggiore di un valore di riferimento
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
Quindi il motore di query non può utilizzare gli indici per il confronto della lunghezza, ma potrebbe essere in grado di farlo per il >
confronto.