LINQ按降序排序,底部为空值
我有这个表达式:
troubletickets = db.ServiceTickets.Include(t => t.Company).Include(t => t.UserProfile); troubletickets.OrderByDescending(t => t.UserProfile != null ? t.UserProfile.FirstName : "ZZZ");
我必须检查UserProfile是否为null,因为如果我不这样做,我将收到错误。 问题是,有时UserProfiles.FirstName可以为null。 当它为null时,当我按升序和降序排序时,这些值将放在列表的顶部。 例如
// Null, Null, Andy, Bill, Chris // Null, Null, Chris, Bill, Andy
我怎样才能改变这个表达式,这样当我按降序排序时,它会返回这样的内容:
// Chris, Bill, Andy, Null, Null
你几乎没错:
troubletickets.OrderByDescending(t => t.UserProfile != null && t.UserProfile.FirstName != null ? t.UserProfile.FirstName : string.Empty);
string.Empty
将始终是最低的字符串,因此它最终会在OrderByDescending
。
如果你想要一些既有升序又有降序的东西,你必须分两步进行排序:
troubletickets.OrderByDescending(t => t.UserProfile != null && t.UserProfile.FirstName != null) .ThenByDescending(t => t.UserProfile != null // Or ThenBy ? t.UserProfile.FirstName : null);
这是因为true > false
。
在一般情况下,您可以做的是首先根据值是否为null 进行排序, 然后根据值本身作为决胜局进行排序。
troubletickets = troubletickets.OrderBy(t => t.UserProfile != null) .ThenByDescending(t => t.UserProfile);
你很接近它
OrderByDescending(t => t.UserProfile != null ? t.UserProfile.FirstName : "ZZZ")
在这里,您声明如果t.userProfile
为null
,则应将其视为其值为ZZZ
。 为t.userProfile.FirstName
做同样的t.userProfile.FirstName
。
OrderByDescending(t => t.UserProfile != null ? t.UserProfile.FirstName ?? "ZZZ" : "ZZZ")
“??” 是coalesce运算符(如果left语句不为null,则使用left语句,否则使用right语句)