2014-04-03 277 views
2

我目前正在動態構建一個linq表達式樹,只使用類型和屬性名稱,代碼如下:「Dynamic LINQ OrderBy on IEnumerable<T>」,請參閱接受的答案。Linq OrderBy使用自定義排序順序

這適用於大多數屬性,但當屬性類型爲枚舉時,我需要自定義排序順序。通過值的字符串表示進行排序,根據語言可以有所不同。

E.g.我有一個車輛類型列表。

public enum VehicleType : int 
{ 
    Car = 1, 
    Train = 2, 
    Bike = 3, 
    etc... 
} 

英文名稱的將是「汽車」,「自行車」和「火車」,但在法國,他們將是「VOITURE」,「火車」和「VELO」,如此明顯的排序順序會有所不同。

構建的表達式必須與NHibernate(版本3.3.1.4000)兼容。在枚舉排序之前和之後可能會添加排序。

我有給定語言正確排列的枚舉的列表(或數組),例如在英語中,該列表將被命令爲「自行車」,「汽車」和「火車」以及法語「火車」,「自行車」和「汽車」,其轉換爲需要的順序爲3,1,2或2,3,4。 1.

無法從數據庫中訪問枚舉值的轉換。例如。我無法查找給定值和語言的名稱。

基本上我需要的是一種通過排序列表中枚舉值的索引來排序搜索結果的方法。

這可能嗎?

+0

你正在使用哪個版本的NHibernate? –

+0

版本3.3.1.4000 – Dasmo

回答

0

你可以得到一個枚舉項的int值如下:

int enumItemValue = (int)YourEnum.EnumItem1; 

使用整數值來訂購列表

如何定義的順序爲每種語言

創建一個自定義屬性,它保存每種語言的枚舉項的順序。 見:http://msdn.microsoft.com/en-us/library/sw480ze8.aspx

+0

這並不回答這個問題,因爲我不想要一個直接的升序或降序排序。例如,我需要根據用戶的語言對結果按值3,1,2或2,3,1進行排序。 – Dasmo

+0

我已添加說明 – sjkm

0

所以建設sjkm的答案,你應該能夠這樣做。

VehicleList.OrderBy(Vehicle => (int)Vehicle.VehicleType); 

此外,您需要確保您有System.Linq的使用說明。

+0

請參閱「http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet」(以及接受的答案)。在我通過表達式生成我的訂單的時候,我擁有的只是一個類型和屬性名稱。如果我能做到這一點,那將是相當簡單的... – Dasmo

0

我已經結束了使用Microsoft編寫的System.Linq.Dynamic代碼來通過字符串構建順序。

E.g. 「VehicleType = Bike?0:1,VehicleType = Car?0:1,VehicleType = Train?0:1」

然後我將它傳遞給擴展方法的順序,它將解析成正確的表達式樹我無法弄清楚)。

對於任何有興趣的人,您可以從這裏下載System.Linq.Dynamic代碼:http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx,或者其他人已經將它作爲NuGet的包添加。