我目前正在使用一个类型和属性名称动态构建一个 linq 表达式树,代码在这里找到:"动态 LINQ OrderBy on IEnumerable
这适用于大多数属性,但是当属性类型为枚举时,我需要自定义排序顺序,例如按值的字符串表示形式排序,这可能因语言而异。
例如,我有一个车辆类型列表。
public enum VehicleType : int
{
Car = 1,
Train = 2,
Bike = 3,
etc...
}
在英语中,名称将是"汽车","自行车"和"火车",但在法语中,它们是"Voiture","Train"和"Vélo",因此显然排序顺序会有所不同。
生成的表达式必须与 NHibernate(版本 3.3.1.4000)兼容。在枚举排序之前和之后可能会添加排序。
我有给定语言正确排序的枚举列表(或数组),例如在英语中,列表将排序为"自行车"、"汽车"和"火车",在法语中为"火车"、"自行车"和"汽车",这转化为所需的顺序 3、1、2 或 2、3、1。
无法从数据库中访问枚举值的转换。 例如,我无法查找给定值和语言的名称。
本质上,我需要的是一种按排序列表中枚举值的索引对搜索结果进行排序的方法。
这可能吗?
所以构建 sjkm 的答案你应该能够像这样做。
VehicleList.OrderBy(Vehicle => (int)Vehicle.VehicleType);
此外,您还需要确保具有 System.Linq 的 using 语句。
您可以按如下方式获取枚举项的 int 值:
int enumItemValue = (int)YourEnum.EnumItem1;
使用该整数值对列表进行排序
如何定义每种语言的顺序
创建一个自定义属性,用于保存每种语言的枚举项的顺序。请参阅:http://msdn.microsoft.com/en-us/library/sw480ze8.aspx
我最终使用了Microsoft编写的System.Linq.Dynamic代码来构建字符串形式的顺序。
例如,"车辆类型 = 自行车 ?0 : 1, 车辆类型 = 汽车 ?0 : 1, 车辆类型 = 火车 ?0 : 1"
然后,我将其传递给按扩展排序方法,该方法会将其解析为正确的表达式树(例如,我无法弄清楚的位)。
对于任何感兴趣的人,都可以从此处下载System.Linq.Dynamic代码:http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx,或者其他人已将其作为包添加到NuGet上。