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.userProfilenull ,则应将其视为其值为ZZZ 。 为t.userProfile.FirstName做同样的t.userProfile.FirstName

  OrderByDescending(t => t.UserProfile != null ? t.UserProfile.FirstName ?? "ZZZ" : "ZZZ") 

“??” 是coalesce运算符(如果left语句不为null,则使用left语句,否则使用right语句)