使用LINQ按降序排序,且空值排在底部

20

我有这个表达式:

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

我必须检查UserProfile是否为空,因为如果不检查就会出错。问题是,有时UserProfiles.FirstName可能为空。当它为空时,在按升序和降序排序时,这些值将放置在列表的顶部。例如:

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

如何修改这个表达式,使得当我按降序排序时,返回类似以下的结果:
// Chris, Bill, Andy, Null, Null
3个回答

29

你差不多做对了:

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


这个建议非常有效。谢谢! - mdk09

5

在一般情况下,你可以通过首先按值是否为空排序,然后按值本身作为决定性因素进行排序来处理它。

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

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")

"

“??”是合并运算符(如果左侧语句不为空,则使用左侧语句,否则使用右侧语句)

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接