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

时间:2014-10-03 20:41:31

标签: c# asp.net-mvc linq entity-framework

我有这个表达:

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时,当我按升序和降序排序时,这些值将放在列表的顶部。 E.g。

// Null, Null, Andy, Bill, Chris
// Null, Null, Chris, Bill, Andy

如何更改此表达式,以便在我按降序排序时返回类似的内容:

// Chris, Bill, Andy, Null, Null

3 个答案:

答案 0 :(得分:21)

你几乎没错:

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

答案 1 :(得分:4)

在一般情况下,您可以做的是首先根据值是否为空来排序,然后根据值本身作为决胜局的然后顺序。

troubletickets = troubletickets.OrderBy(t => t.UserProfile != null)
   .ThenByDescending(t => t.UserProfile);

答案 2 :(得分:2)

你离它很近

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

在此,您声明如果t.userProfilenull,则应视为其值为ZZZ。只需为t.userProfile.FirstName添加相同内容。

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

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