按可为空的子记录值排序

本文关键字:记录 排序 | 更新日期: 2023-09-27 18:09:24

我已经尝试了一些组合,但我就是不明白如何做到以下:

假设我有表RequestsRequestActivities。我需要得到所有的请求排序的RequestActivity。TimeOfCreation按降序排列,但RequestActivity可能为空。

      List<DA.GeneralRequest> ongoingGeneralRequests = db.GeneralRequests
          .Where(t => t.GeneralRequestStatusID != 3 && (t.SupervisorID == currentUserId || t.CreatorID == currentUserId || t.AssignedUsers.Any(au => au.UserID == currentUserId)))
          .OrderByDescending(x => x.GeneralRequestActivities.OrderBy(ga => ga.GeneralRequestActivityDate).Last().GeneralRequestActivityDate) //gives exeption
          .ThenBy(a => a.Deadline).ToList();

按可为空的子记录值排序

我不太熟悉LINQ-To-SQL,但在这种情况下不工作MAX ?

.OrderByDescending(x => x.GeneralRequestActivities
                         .Max(ga => ga.GeneralRequestActivityDate))
.ThenBy(a => a.Deadline)
.ToList();

您需要首先缓存排序值,然后按日期排序,如果它不是空的,否则按您想要的默认日期排序:

List<DA.GeneralRequest> ongoingGeneralRequests = db.GeneralRequests
      .Where(t => t.GeneralRequestStatusID != 3 && (t.SupervisorID == currentUserId || t.CreatorID == currentUserId || t.AssignedUsers.Any(au => au.UserID == currentUserId)))
      .Select(x => new {
                    Value = x, 
                    OrderByValue = x.GeneralRequestActivities
                             .OrderBy(ga => ga.GeneralRequestActivityDate)
                             .LastOrDefault()) // cache value
      .OrderByDescending(x => x.OrderByValue != null ? 
                                  OrderByValue.GeneralRequestActivityDate 
                                : some default value)
      .ThenBy(a => a.Value.Deadline)
      .Select(a => a.Value)
      .ToList();

注意不能在空IEnumerable上使用Last()扩展方法。这就是为什么你会得到异常:

InvalidOperationException: source sequence is empty.

这一行:

x.GeneralRequestActivities.OrderBy(ga => ga.GeneralRequestActivityDate).Last()

x.GeneralRequestActivities为空,因此调用Last()将导致异常。

请使用LastOrDefault()扩展方法,如果IEnumerable为空,则返回null

返回值类型:TSource default (TSource)空的;