2015-04-03 131 views
6

我有實體的列表,可以表示這樣的:如何通過自定義訂單來訂購實體列表?

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

類型是一個字符串,並只能是4個不同值的一個 (例如A,B,C,d)。我需要通過類型訂購這些實體,但需要訂購訂單(例如A,D,B,C)。

我想是這樣的:

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

,但我得到了以下錯誤:

LINQ到實體無法識別方法 '的Int32 get_Item(System.String)' 的方法,這方法不能轉換成商店表達式。

我不明白這個錯誤,不知道如何處理這個OrderBy。您能否告訴我如何通過訂單這些實體類型與自定義訂單?

+0

這行不通,是因爲的EntityFramework就需要到SQL派德字典中的一些原因方式,它不能有效地做。 – jessehouwing 2015-04-03 10:12:42

+0

您可以通過告訴EntityFramework如何將您的字典翻譯爲基於謂詞的函數來實現此目的。 http://stackoverflow.com/a/16839341/736079 – jessehouwing 2015-04-03 10:13:46

回答

4

I don't understand this error

這是因爲LINQ到SQL無法翻譯詞典Int32 get_Item(System.String)到SQL等效操作。


一個解決這個問題很簡單的方法是通過AsEnumerable()把內存中的實體:

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

的確,它的工作完美。謝謝你的解釋。 – Alex 2015-04-03 10:20:46

+0

有沒有解決方案不會將它帶入內存? – 2017-11-09 13:57:07