按可为空的子记录值排序
本文关键字:记录 排序 | 更新日期: 2023-09-27 18:09:24
我已经尝试了一些组合,但我就是不明白如何做到以下:
假设我有表Requests和RequestActivities。我需要得到所有的请求排序的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)空的;