131 messaggi dal 06 giugno 2011
Ciao a tutti, sto cercando una soluzione per poter ordinare un campo alfanumerico come se fosse un campo numerico, ho ad esempio 100d,101d,56c etc...).
Il problema è che non posso utilizzare un comparer siccome la tabella è abbastanza grande circa 100.000 record (per ora e aumenterà), a fare il compare di ogni singolo record ci sta un eternità, quindi volevo sapere se c'era qualche altra soluzione se la facci oa livello di database diciamo che e abbastanza veloce, ma non so come poter fare attraverso linq.

io ho un codice simile :
 myrepository.Where(x=>x... una serie di filtri).OrderBy(x=>x.CodiceSezionaleRegistroIva)


Nel db invece se eseguo questo algoritmo ,funziona bene:

SELECT CodiceSezionaleRegistroIva,* FROM [Sedna.ABIOMED_16].[dbo].CorpoContabilita
ORDER BY 
CASE 
  WHEN ISNUMERIC(CodiceSezionaleRegistroIva)=1 
  THEN CAST(CodiceSezionaleRegistroIva as int)

  WHEN PATINDEX('%[^0-9]%',CodiceSezionaleRegistroIva) > 1 
  THEN CAST(
    LEFT(
      CodiceSezionaleRegistroIva,
      PATINDEX('%[^0-9]%',CodiceSezionaleRegistroIva) - 1
    ) as int)

  ELSE 2147483648
END, 


CASE 
  WHEN ISNUMERIC(CodiceSezionaleRegistroIva)=1 
  THEN NULL

  WHEN PATINDEX('%[^0-9]%',CodiceSezionaleRegistroIva) > 1 
  THEN SUBSTRING(
      CodiceSezionaleRegistroIva,
      PATINDEX('%[^0-9]%',CodiceSezionaleRegistroIva) ,
      50
    ) 

  ELSE CodiceSezionaleRegistroIva
END


Non c'è un modo per poter innietare solo lo script riguardante l'order by nella query sql?
oppure qualche altra soluzione?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

Non c'è un modo per poter innietare solo lo script riguardante l'order by nella query sql?

Sì, con Entity Framework 6.x puoi usare gli interceptor, che ti permettono di modificare la query al volo, subito prima che il provider la invii al database.
http://www.entityframeworktutorial.net/entityframework6/database-command-interception.aspx

Tuttavia, io lo eviterei perché la tua espressione ORDER BY non può avvalersi di indici e perciò non potrà mai avere le performance che avresti ordinando su una colonna integer.

Io ti consiglio di creare una colonna apposita che contiene il risultato di questa espressione:
CASE 
  WHEN ISNUMERIC(CodiceSezionaleRegistroIva)=1 
  THEN CAST(CodiceSezionaleRegistroIva as int)

  WHEN PATINDEX('%[^0-9]%',CodiceSezionaleRegistroIva) > 1 
  THEN CAST(
    LEFT(
      CodiceSezionaleRegistroIva,
      PATINDEX('%[^0-9]%',CodiceSezionaleRegistroIva) - 1
    ) as int)

  ELSE 2147483648
END

e mettici un indice, dato che la usi per l'ordinamento.

Puoi generarti il valore da C# o usando un trigger.

ciao,
Moreno

Enjoy learning and just keep making
131 messaggi dal 06 giugno 2011
ciao grazie per la risposta, in realtà avevo pensato di crearmi una colonna non mappata nel db di tipo intero, e poi fare l'order by per quella colonna.

ma con ef code first come vengono gestiti l'indice per una determinata colonna?
Non essendo mappata sul db non posso creare un indice,o sbaglio?

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.