2015-04-03 17 views
6

Ho una lista di entità che potrebbe rappresentare così:Come ordinare un elenco di entità con un ordine personalizzato?

Type | Property A | Property B | ... 
-------------------------------------- 
A | ABC  | 123  | ... 
A | ABC  | 123  | ... 
D | ABC  | 123  | ... 
D | ABC  | 123  | ... 
B | ABC  | 123  | ... 
C | ABC  | 123  | ... 

tipo è una stringa e può essere solo uno di 4 valori distinti (e g A, B, C, D). Devo ordinare queste entità per Digitare ma con un ordine personalizzato (ad esempio A, D, B, C).

Ho provato qualcosa di simile:

var orderType = new Dictionary<string, int>() { 
        { "A", 0 }, 
        { "D", 1 }, 
        { "B", 2 }, 
        { "C", 3 } 
       }; 
return db.MyEntity 
     .OrderBy(x => orderType[x.Type]) 
     .ToList(); 

ma ottengo il seguente errore:

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

Non capisco questo errore e non so cosa fare con questo ordine. Potresti dirmi come ordinare queste entità tramite Digitare con un ordine personalizzato?

+0

La ragione per cui questo non funziona è perché EntityFramework sarà necessario inviare teh dizionario verso SQL in qualche modo, che non può fare in modo efficiente. – jessehouwing

+0

È possibile ottenere ciò dicendo a EntityFramework come tradurre il dizionario in una funzione basata sui predicati. http://stackoverflow.com/a/16839341/736079 – jessehouwing

risposta

4

I don't understand this error

è perché LINQ to SQL non può tradurre Int32 get_Item(System.String) di dizionario in un'operazione equivalente in SQL.


Un modo molto semplice per risolverlo è quello di portare le entità in memoria da AsEnumerable():

return db.MyEntity.AsEnumerable(). 
     .OrderBy(x => orderType[x.Type]) 
     .ToList(); 
+1

Effettivamente, funziona perfettamente. Grazie per la spiegazione. – Alex

+0

C'è qualche soluzione per non portarlo in memoria? –

Problemi correlati