2011-11-10 13 views
19

Ho alcuni dati provenienti da un DB che non posso modificare facilmente lo schema di. Voglio ordinarlo e associarlo a un controllo basato su un ID numerico. Il problema è che l'API memorizza il numero in un campo stringa anziché come int e Linf barfs nel tentativo di conversione.Come ordinareIn un numero intero in un campo stringa in una query Linq

myControl.DataSource = dataFromDB.OrderBy(o => int.Parse(o.StringHoldingAnInt)); 

LINQ alle entità non riconosce il metodo 'Int32 Parse (System.String)' metodo, e questo metodo non può essere tradotto in un'espressione negozio.

Convert.ToInt32 non funziona.

LINQ to Entities non riconosce il metodo 'Int32 ToInt32 (System.String)', e questo metodo non può essere tradotto in un'espressione di archivio.

ordinamento come stringa non è adatto perché i valori non sono tutte la stessa lunghezza e otterrebbe ordinare simili: 1, 10, 11, 2, 3 ..

+0

Quanti dati ci sono? Sarebbe possibile ordinare dal lato del cliente? – dlev

+0

Si potrebbe provare a riempire la stringa con '0' in modo che abbiano tutti la stessa lunghezza ... ma non sono sicuro che String.PadLeft sia supportato da Linq. –

+0

@dlev diverse centinaia di righe nel DB, solo poche decine di righe dopo la query Where() che ho omesso dalla mia domanda. –

risposta

14

Questo won' essere quasi altrettanto efficiente perché non stai sfruttando la query del database per filtrare i risultati, ma fondamentalmente si interroga su tutti i dati, quindi si filtra sul client.

myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt)); 
+0

La mia query integrale fa un Where() prima dell'ordine per comando per ridurre la quantità di dati a una dimensione ragionevole, quindi il carico di elaborazione lato client non dovrebbe essere eccessivo. –

1

Si potrebbe convertire la query a un elenco:

var query = ...; 
var list = query.ToList(); 

Ora è possibile ordinare dai valori convertendolo:

list.OrderBy(o => int.Parse(o.StringHoldingAnInt)); 

Il problema di questo è che si stanno recuperando molti valori provengono tutti dal database e poi ordinate in memoria.

+3

Proprio così nessuno è confuso, '.OrderBy()' restituisce un 'IEnumerable'. La riga 'list.OrderBy()' qui sopra non eseguirà attualmente nulla, poiché non si assegna il valore di ritorno da '.OrderBy()' a una variabile. –

1

È possibile farlo sul lato DB. L'idea è presa da here. Quindi ordina l'ordinamento con una stringa opportunamente formattata (zero caratteri vengono aggiunti a sinistra e quindi la quantità necessaria di caratteri viene presa da destra)

myControl.DataSource = dataFromDB 
    .OrderBy(o => DbFunctions.Right("00000" + o.StringHoldingAnInt, 7)); 
Problemi correlati