2014-10-03 7 views
11

Descending habe ich diesen Ausdruck:LINQ Bestellung mit Nullwerten auf Bottom

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

Ich habe zu prüfen, ob Userprofile null ist, weil, wenn ich nicht tun werde ich einen Fehler. Das Problem ist, dass UserProfiles.FirstName manchmal null sein kann. Wenn es null ist, werden diese Werte am Anfang der Liste platziert, wenn ich sowohl aufsteigend als auch absteigend sortiere. Z.B.

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

Wie kann ich diesen Ausdruck verändern, so dass, wenn ich nach absteigender Reihenfolge es so etwas wie diese gibt statt:

// Chris, Bill, Andy, Null, Null 

Antwort

18

Sie es fast Recht haben:

troubletickets.OrderByDescending(t => t.UserProfile != null 
             && t.UserProfile.FirstName != null 
             ? t.UserProfile.FirstName 
             : string.Empty); 

string.Empty wird immer sei der niedrigste String, so wird es zuletzt in einem OrderByDescending enden.

Wenn Sie etwas wollen, das sowohl mit auf- und absteigender Reihenfolge funktioniert, dann würden Sie in zwei Schritten zu sortieren haben:

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

Dies, weil true > false funktioniert.

+0

Dieser Vorschlag funktionierte perfekt. Vielen Dank! – mdk09

1

Sie sind nah an ihm

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

Hier Sie besagt, dass, wenn t.userProfilenull ist, sollte es als angesehen werden, wenn ihr Wert war ZZZ. Machen Sie das gleiche für t.userProfile.FirstName.

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

Die "??" ist der Coalesce-Operator (wenn left-Anweisung nicht null ist, verwenden Sie left-Anweisung, sonst verwenden Sie right-Anweisung)

2

Was Sie tun können, um es im allgemeinen Fall zu behandeln, ist die Reihenfolge, ob der Wert null ist und nicht dann Reihenfolge basierend auf dem Wert selbst als Tiebreaker.

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