Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Conversione di string in int in linq in entità su un grande database

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.