sql >> Databáze >  >> RDS >> Sqlserver

Převod řetězce na int v linq na entity ve velké databázi

Myslím, že je docela bezpečné provést srovnání jako řetězec, pokud nemáte roky <1000 nebo> 9999:

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

EF to převede na predikát SQL jako

WHERE [alias].[stringYear] > @p

což je možné v SQL, ale ne v C#.

Výhodou by bylo, že jakýkoli index na stringYear mohou být použitelné v prováděcím plánu. Převádí se stringYear to number eliminuje jakýkoli index.

Tato metoda je stále užitečná, když sloupec řetězce obsahuje zubaté hodnoty řetězce. V takovém případě by měl být predikát kombinován s délkou. Chcete-li například najít všechny entity, kde je jakýkoli číselný řetězec jako celé číslo větší než nějaká referenční hodnota

var len = myNumberString.Lenght;

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

Dotazovací modul pak nemůže použít indexy pro porovnání délky, ale může to udělat pro > srovnání.



  1. Návrh databáze pro uložení barevného vzoru obrázku v MySQL pro vyhledávání obrázku podle barvy

  2. Yii2:jak zadat schémata vícenásobné databáze?

  3. Použití DBMS_LOB.SUBSTR na objekt BLOB vede k ORA-06502

  4. Swiftový kód neaktualizuje databázi MySQL