2014-10-03 81 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);