【问题标题】:LINQ Order List By SubObject with possible Null Reference子对象的 LINQ 顺序列表,可能为空引用
【发布时间】:2016-05-26 20:13:10
【问题描述】:

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

我有一个客户列表,每个客户都有一个订单列表。我现在想按客户的最高订单号对客户列表进行排序。 另一方面是不是每个客户都有订单,所以为了排序,我想用“-”号替换缺失的订单号。

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

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 个订单分配给他,这就是我使用 null 的意思。

【问题讨论】:

  • 请添加输入和输出以便更好地理解
  • 从您的 cmets 获取当前答案看起来您正在寻找 LINQ to Entities 查询。如果这是真的,请相应地更新帖子和标签。这是因为 LINQ to Entities 支持有限的构造集,而且第一种方法中的 m.Orders 和第二种方法中的 o 都不能是 null
  • 我会尽快更新我的问题。
  • 顺便说一句,您确定按数字排序转换为字符串会产生正确的排序吗?我不这么认为,例如“11”将在“2”之前。通过“-”,我猜您希望没有订单的客户在订单中排在第一位。
  • 你是绝对正确的字符串比较不是正确的方法

标签: c# linq sorting


【解决方案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);

【讨论】:

  • 这真是天才。如此简单且非常高效。非常感谢
  • 你会怎么做才能让没有订单的客户退居二线?
  • 你可以使用.Max(...) ?? int.MaxValue(希望你没有OrderNumber == int.MaxValue :)
【解决方案2】:

您可以先删除没有订单的客户,然后使用 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();

让我知道这是否适用于您的用例。

久违了

【讨论】:

  • 不起作用 :( -> 无法比较类型为 'System.Collections.Generic.List`1[[Lib.Entitys.Order, Lib, Version=1.0.0.0, Culture=neutral , PublicKeyToken=null]]'。仅支持原始类型、枚举类型和实体类型。
  • 编辑了我的答案:FirstOrDefault 丢失,它尝试使用列表而不是应该导致错误的 OrderNumber 进行排序
  • 还是同样的问题。我将在几分钟内添加一个示例小提琴
  • 我认为这个问题与 Where 子句中的比较有关。尝试使用更新后的代码与 o.Count == 0 而不是 o == null
  • 那接缝工作。我现在只遇到连接和跳过的问题。在您的查询之后,在最后没有 .ToList() 以提高数据库性能,我想通过 Skip 和 Take 添加一个分页功能,但它会引发错误,因为我返回的是 IQueryable 而不是预期的 IOrderedQueryable。有人对此有意见吗?
猜你喜欢
  • 1970-01-01
  • 2021-08-27
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多