2015-04-03 31 views
6

mam listę podmiotów, które mogą być przedstawione, tak jak:Jak zamówić listę jednostek przez zamówienie niestandardowe?

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

Typ to łańcuch i może być tylko jeden z 4 różnych wartości (na przykład A, B, C, D). Muszę zamówić te jednostki przez Typ, ale z zamówieniem niestandardowym (np. A, D, B, C).

Próbowałem coś takiego:

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

Ale pojawia się następujący błąd:

LINQ do podmiotów nie rozpoznaje metody 'Int32 get_Item (System.String)' metoda i ta metody nie można przetłumaczyć na wyrażenie składowania.

Nie rozumiem tego błędu i nie wiem, co zrobić z tym użytkownikiem. Czy możesz mi powiedzieć, jak zamówić te jednostki przez Wpisz z zamówieniem niestandardowym?

+0

Powód to nie działa, ponieważ jest EntityFramework będą musiały wysłać teh Słownik nad SQL w niektórych sposób, który nie może zrobić wydajnie. – jessehouwing

+0

Możesz to osiągnąć, mówiąc EntityFramework jak przetłumaczyć twój słownik na funkcję opartą na predykatach. http://stackoverflow.com/a/16839341/736079 – jessehouwing

Odpowiedz

4

I don't understand this error

To dlatego LINQ to SQL nie może tłumaczyć Int32 get_Item(System.String) słownika w równoważnej operacji w SQL.


Bardzo prosty sposób na jego rozwiązanie jest doprowadzenie podmiotów w pamięci przez AsEnumerable():

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

Rzeczywiście, działa idealnie. Dziękuję za wyjaśnienie. – Alex

+0

Czy istnieje jakieś rozwiązanie, aby nie wprowadzać go do pamięci? –

Powiązane problemy