LINQ – 复杂排序

我正在使用LINQ(C#)查询Order元素表。 每个订单都包含以下字段:

- ID - OpenDate - PriorityID - StatusID - Description 

StatusID字段映射到Status表。 Status表的结构如下:

 - ID - Name 

我需要按照优先级和状态对所有Order对象进行排序。 我可以成功获取按优先级排序的Order对象。 我是通过以下方式做到的:

 List orders = new List(); using (DBDataContext context = new DBDataContext()) { orders = (from o in context.Orders orderby (o.PriorityID.HasValue ? o.PriorityID : Int32.MaxValue) ascending select o).ToList(); } 

但我的问题是考虑到状态。

一旦订单对象按优先级排序,我需要按以下状态顺序对Order对象进行排序:Cancelled,Open,In-Route和Delivered。 值得注意的是,这些状态值的ID是以随机,无用的顺序设置的。 我无法改变它们。 你可以告诉我,我也不能按照alphbetical名称对状态进行排序。 另外,我无法向我的数据库添加任何字段。 任何人都可以告诉我如何在LINQ中解决这个问题?

谢谢!

我认为您可以通过实现IComparer并使用Linq对其进行排序来解决此问题。 由于您的状态不是数字或字母顺序。

 public class CustomComparer : IComparer { public int Compare(Status statusA, Status statusB) { if (statusA.StatusName == "Cancelled" && statusB.StatusName == "Cancelled") { return 0; // equals } else if (statusA.StatusName == "Cancelled" && statusB.StatusName != "Cancelled") { return 1; // A > B } .... } } 

然后

 orders.OrderBy(x => x.Status, new CustomComparer()) 

希望这可以帮助。

只要状态列表保持一致,您就可以创建一个字符串,例如“COID”,并根据“COID”.indexOf(firstletterofstatus)比较两种状态。 也许不是最好的软件实践,但它会起作用。

如果它不是一个长列表(即它将合理地适合内存),您可以使用状态和相关订单之间的映射对客户端进行排序:

 int StatusOrder(Status status) { switch(status.Id) { case 1: return 5; case 2: return 1; case 4: return 3; //etc } } List orders; //no need to create a list here using (DBDataContext context = new DBDataContext()) { orders = (from o in context.Orders orderby (o.PriorityID.HasValue ? o.PriorityID : Int32.MaxValue) ascending, SorderOrder(o.Status) select o).ToList(); }