Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertieren von Zeichenfolgen in Int in Linq zu Entitäten in einer großen Datenbank

Ich denke, es ist ziemlich sicher, den Vergleich als Zeichenfolge durchzuführen, es sei denn, Sie haben Jahre <1000 oder> 9999:

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

EF übersetzt dies in ein SQL-Prädikat wie

WHERE [alias].[stringYear] > @p

was in SQL möglich ist, aber nicht in C#.

Ein Vorteil wäre, dass jeder Index auf stringYear kann in einem Ausführungsplan verwendet werden. Konvertieren von stringYear zu nummerieren eliminiert jeden Index.

Diese Methode ist immer noch nützlich, wenn die Zeichenfolgenspalte gezackte Zeichenfolgenwerte enthält. In einem solchen Fall sollte das Prädikat mit Länge kombiniert werden. Zum Beispiel, um alle Entitäten zu finden, bei denen eine beliebige numerische Zeichenfolge als Ganzzahl größer als ein Referenzwert ist

var len = myNumberString.Lenght;

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

Dann kann die Abfrage-Engine keine Indizes für den Längenvergleich verwenden, aber möglicherweise für den > Vergleich.