LINQ按降序排序,底部为空值

mdk*_*k09 15 c# linq asp.net-mvc entity-framework

我有这个表达式:

troubletickets = db.ServiceTickets.Include(t => t.Company).Include(t => t.UserProfile);
troubletickets.OrderByDescending(t => t.UserProfile != null ? t.UserProfile.FirstName : "ZZZ");
Run Code Online (Sandbox Code Playgroud)

我必须检查UserProfile是否为null,因为如果我不这样做,我将收到错误.问题是,有时UserProfiles.FirstName可以为null.当它为null时,当我按升序和降序排序时,这些值将放在列表的顶部.例如

// Null, Null, Andy, Bill, Chris
// Null, Null, Chris, Bill, Andy
Run Code Online (Sandbox Code Playgroud)

我怎样才能改变这个表达式,这样当我按降序排序时,它会返回类似这样的内容:

// Chris, Bill, Andy, Null, Null
Run Code Online (Sandbox Code Playgroud)

Luc*_*ski 25

你几乎是对的:

troubletickets.OrderByDescending(t => t.UserProfile != null
                                      && t.UserProfile.FirstName != null
                                         ? t.UserProfile.FirstName
                                         : string.Empty);
Run Code Online (Sandbox Code Playgroud)

string.Empty将始终是最低的字符串,因此它最终将成为最后一个字符串OrderByDescending.

如果你想要一些既有升序又有降序的东西,你必须分两步进行排序:

troubletickets.OrderByDescending(t => t.UserProfile != null
                                      && t.UserProfile.FirstName != null)
              .ThenByDescending(t => t.UserProfile != null                // Or ThenBy
                                         ? t.UserProfile.FirstName
                                         : null);
Run Code Online (Sandbox Code Playgroud)

这是因为true > false.


Ser*_*rvy 5

在一般情况下,您可以做些什么来处理它,首先根据值是否为空进行排序,然后根据值本身作为决胜局进行排序。

troubletickets = troubletickets.OrderBy(t => t.UserProfile != null)
   .ThenByDescending(t => t.UserProfile);
Run Code Online (Sandbox Code Playgroud)