1

我尝试了一些组合,但我只是不明白如何执行以下操作:

假设我有表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();
4

2 回答 2

3

我对 LINQ-To-SQL 不是很熟悉,但在这种情况下不起作用MAX

.OrderByDescending(x => x.GeneralRequestActivities
                         .Max(ga => ga.GeneralRequestActivityDate))
.ThenBy(a => a.Deadline)
.ToList();
于 2013-04-16T15:41:28.810 回答
1

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

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

请注意,您不能Last()对空的 IEnumerable 使用扩展方法。这就是你得到异常的原因:

InvalidOperationException :源序列为空。

在这一行:

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

x.GeneralRequestActivities是空的,所以调用Last()它会导致异常。

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

返回值 类型:如果源序列为空,则默认为 TSource (TSource);否则,IEnumerable 中的最后一个元素。

于 2013-04-16T15:43:38.400 回答