LINQ Order List By SubObject with Null Reference

时间:2016-05-26 09:59:14

标签: c# linq sorting

经过几个小时的尝试和研究后,我仍然遇到以下问题。

我有一个客户列表,每个客户都有一个订单列表。我现在想要按最高订单号对客户列表进行排序。 另一个方面是并非每个客户都有订单,因此对于排序我想用“ - ”符号替换缺少的订单号。

我的第一种方法不起作用,因为它无法比较对象,但它很好地解释了问题。

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个订单,这就是我的意思。

2 个答案:

答案 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();

如果这适用于您的用例,请告诉我。

太长了