【问题标题】:Linq OrderBy using a custom sort orderLinq OrderBy 使用自定义排序顺序
【发布时间】:2014-04-03 19:50:45
【问题描述】:

我目前正在动态构建一个 linq 表达式树,仅使用类型和属性名称以及此处的代码:“Dynamic LINQ OrderBy on IEnumerable<T>”,请参阅接受的答案。

这适用于大多数属性,但是当属性类型是枚举时,我需要自定义排序顺序,例如按值的字符串表示排序,这可能因语言而异。

例如我有一个车辆类型列表。

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

在英语中,名称将是“Car”、“Bike”和“Train”,但在法语中,它们会是“Voiture”、“Train”和“Vélo”,因此显然排序顺序会有所不同。

构建的表达式必须与 NHibernate(版本 3.3.1.4000)兼容。在枚举排序之前和之后可能会添加排序。

我有为给定语言正确排序的枚举列表(或数组),例如在英语中,列表将按“Bike”、“Car”和“Train”的顺序排列,而在法语中,“Train”、“Bike”和“Car”的顺序是 3、1、2 或 2、3, 1.

无法从数据库中访问枚举值的翻译。例如。我无法查找给定值和语言的名称。

基本上我需要的是一种通过排序列表中枚举值的索引对搜索结果进行排序的方法。

这可能吗?

【问题讨论】:

  • 您使用的是哪个版本的 NHibernate?

标签: c# linq sorting nhibernate enums


【解决方案1】:

所以构建 sjkm 的答案你应该可以这样做。

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

您还需要确保您有 System.Linq 的 using 语句。

【讨论】:

  • 请参阅“stackoverflow.com/questions/41244/…”(以及已接受的答案)。在这一点上,我通过表达式生成我的订单,我所拥有的只是一个类型和属性名称。如果我能做到以上,那将是非常简单的......
【解决方案2】:

可以通过如下方式获取枚举项的int值:

int enumItemValue = (int)YourEnum.EnumItem1;

使用该整数值对您的列表进行排序

如何定义每种语言的顺序

创建一个自定义属性,用于保存每种语言的枚举项的顺序。 见:http://msdn.microsoft.com/en-us/library/sw480ze8.aspx

【讨论】:

  • 这不能回答问题,因为我不想要直接升序或降序排序。例如,我需要根据用户的语言按值顺序 3、1、2 或 2、3、1 对结果进行排序。
  • 我已经添加了解释
【解决方案3】:

我最终使用了 Microsoft 编写的 System.Linq.Dynamic 代码,用于将订单构建为字符串。

例如“VehicleType = 自行车?0:1,VehicleType = 汽车?0:1,VehicleType = 火车?0:1”

然后我通过扩展方法将其传递给订单,该方法会将其解析为正确的表达式树(例如,我无法弄清楚的位)。

有兴趣的人可以从这里下载 System.Linq.Dynamic 代码:http://msdn.microsoft.com/en-US/vstudio/bb894665.aspx,或者其他人已将其作为包添加到 NuGet。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多