经过几个小时的尝试和研究后,我仍然遇到以下问题。
我有一个客户列表,每个客户都有一个订单列表。我现在想要按最高订单号对客户列表进行排序。 另一个方面是并非每个客户都有订单,因此对于排序我想用“ - ”符号替换缺少的订单号。
我的第一种方法不起作用,因为它无法比较对象,但它很好地解释了问题。
customers.OrderBy(m => m.Orders == null ? "-" : m.Orders.LastOrDefault().OrderNumber.ToString());
在阅读下面的链接后,我最终得到了这段代码,但这也无效。
how do I sort a collection with child property?
customers.OrderBy(c => c.Orders.OrderBy(o => o == null ? "-" : o.OrderNumber.ToString()).Select(o => o == null ? "-" : o.OrderNumber.ToString()).ToList();
有人能告诉我如何才能做到最好吗?
最好的问候
编辑:
以下是我正在尝试排序的实体(不是完整实体)。 我正在使用实体框架,我已经将客户作为IQueryable读出来,现在我需要对此进行排序。
客户
public class Customer
{
public int ID { get; set; }
public virtual List<Order> Orders { get; set; }
}
顺序
public class Order {
public int ID { get; set; }
public int OrderNumber { get; set; }
public virtual Customer Customer { get; set; }
}
现在,客户不一定有关联的订单列表。 这意味着客户可以分配0,1或n个订单,这就是我的意思。
答案 0 :(得分:1)
我现在想按最高订单编号对客户列表进行排序。
然后以下应该做的诀窍:
var result = customers.OrderBy(c => c.Orders.Max(o => (int?)o.OrderNumber));
需要int?
强制转换才能让Max
函数为没有订单的客户返回null
。这通常会将它们放在排序顺序的开头。
如果你想在最后把没有订单的客户,最简单的方法是使用int.MaxValue
(假设你没有OrderNumber == int.MaxValue
):
var result = customers.OrderBy(c => c.Orders.Max(o => (int?)o.OrderNumber) ?? int.MaxValue);
答案 1 :(得分:0)
您可以先删除没有订单的客户,然后使用Concat()
将其添加回来customers
.Where(c => c.Orders.Count() != 0)
.OrderBy(c => c.Orders.OrderBy(o => o.OrderNumber).Select(o => o.OrderNumber).FirstOrDefault())
.Concat(customers.Where(c => c.Orders.Count() == 0))
.ToList();
如果这适用于您的用例,请告诉我。
太长了