2014-10-03 79 views
11

我降序有这样的表达:LINQ排序空值在底部

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

我要检查,如果用户配置为null,因为如果我不这么做,我会得到一个错误。问题是,有时UserProfiles.FirstName可能为空。当它为空时,当我按升序和降序进行排序时,这些值被放置在列表顶部。例如。

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

我怎样才能改变这种表达,这样,当我通过降序排列返回这样的事情,而不是:

// Chris, Bill, Andy, Null, Null 

回答

18

你几乎拥有了正确的:

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

+0

这个建议工作完美。谢谢! – mdk09 2014-10-03 21:00:46

1

你靠近它

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

“??”是合并运算符(如果left语句不为null,则使用left语句,否则使用正确的语句)

2

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

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