sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera sträng till int i linq till entiteter på stor databas

Jag tror att det är ganska säkert att göra jämförelsen som sträng, om du inte har år <1000 eller> 9999:

... dr.stringYear.CompareTo(myNumberString) > 0

EF översätter detta till ett SQL-predikat som

WHERE [alias].[stringYear] > @p

vilket är möjligt i SQL men inte i C#.

En fördel skulle vara att något index på stringYear kan vara användbar i en genomförandeplan. Konverterar stringYear till nummer eliminerar alla index.

Den här metoden är fortfarande användbar när strängkolumnen innehåller taggiga strängvärden. I ett sådant fall bör predikatet kombineras med Length. Till exempel för att hitta alla entiteter där en numerisk sträng som heltal är större än ett referensvärde

var len = myNumberString.Lenght;

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

Då kan frågemotorn inte använda index för längdjämförelsen men den kanske kan göra det för > jämförelse.



  1. Hantera Unicode-sekvenser i postgresql

  2. MySQL - Hur begränsar man ett resultat per ID?

  3. Hur gör jag en manuell avinstallation av Oracle?

  4. Hämta senaste 1 veckas rekord per dag