sql >> Database >  >> RDS >> Sqlserver

String converteren naar int in linq naar entiteiten in grote database

Ik denk dat het vrij veilig is om de vergelijking als string te doen, tenzij je jaren <1000 of> 9999 hebt:

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

EF vertaalt dit naar een SQL-predikaat zoals

WHERE [alias].[stringYear] > @p

wat mogelijk is in SQL maar niet in C#.

Een voordeel zou zijn dat elke index op stringYear bruikbaar zijn in een uitvoeringsplan. stringYear converteren naar nummer elimineert elke index.

Deze methode is nog steeds handig wanneer de tekenreekskolom gekartelde tekenreekswaarden bevat. In zo'n geval moet het predikaat worden gecombineerd met Lengte. Om bijvoorbeeld alle entiteiten te vinden waar een numerieke tekenreeks als geheel getal groter is dan een referentiewaarde

var len = myNumberString.Lenght;

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

Dan kan de query-engine geen indexen gebruiken voor de lengtevergelijking, maar wel voor de > vergelijking.



  1. CONCAT meerdere velden naar een enkel veld, enkele spatie

  2. Voeg twee tabellen samen op basis van tijdstempels in de buurt

  3. Hoe een Heroku PG-dump in een lokale machine te importeren?

  4. Groeperingen ophalen uit veel-op-veel tabellen