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)比较两种状态。 也许不是最好的软件实践,但它会起作用。
如果它不是一个长列表(即它将合理地适合内存),您可以使用状态和相关订单之间的映射对客户端进行排序:
上述就是C#学习教程:LINQ – 复杂排序分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
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(); }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/959082.html