Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Convertendo string para int no linq para entidades no banco de dados grande


Acho bastante seguro fazer a comparação como string, a menos que você tenha anos <1000 ou> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0

EF traduz isso em um predicado SQL como
WHERE [alias].[stringYear] > @p

o que é possível em SQL, mas não em C#.

Uma vantagem seria que qualquer índice em stringYear pode ser usado em um plano de execução. Convertendo stringYear to number elimina qualquer índice.

Esse método ainda é útil quando a coluna de string contém valores de string irregulares. Nesse caso, o predicado deve ser combinado com Comprimento. Por exemplo, para encontrar todas as entidades onde qualquer string numérica como inteiro é maior que algum valor de referência
var len = myNumberString.Lenght;

var query = 
    from row in context.LegacyTable
    where row.NumericString.CompareTo(myNumberString) > 0
       && row.NumericString.Length >= len
    select row; 

Então, o mecanismo de consulta não pode usar índices para a comparação de comprimento, mas pode fazê-lo para o > comparação.