2014-10-03 13 views
11

Ho questa espressione:LINQ Ordinare scendendo con valori nulli sul fondo

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

devo controllare se UserProfile è nullo perché se non lo faccio mi metterò un errore. Il problema è che a volte UserProfiles.FirstName può essere nullo. Quando è nullo, quei valori sono posti in cima alla lista quando ordino sia in ordine ascendente che discendente. Per esempio.

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

Come posso modificare questa espressione in modo che quando ordino scendendo esso restituisce qualcosa di simile a questo, invece:

// Chris, Bill, Andy, Null, Null 

risposta

18

È quasi aveva ragione:

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

string.Empty sarà sempre essere la stringa minima più , quindi finirà per ultimo in un OrderByDescending.

Se si desidera qualcosa che funziona sia con ordine ascendente e discendente, che avrebbe dovuto ordinare in due fasi:

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

Questo funziona perché true > false.

+0

Questo suggerimento ha funzionato perfettamente. Grazie! – mdk09

1

vi sono vicino ad essa

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

Qui, si sta affermando che se t.userProfile è null, dovrebbe essere considerata come se il suo valore era ZZZ. Basta fare lo stesso per t.userProfile.FirstName.

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

"??" è l'operatore di coalizione (se l'istruzione di sinistra non è nulla, usa l'istruzione di sinistra, altrimenti usa l'istruzione di destra)

2

Quello che puoi fare per gestirlo nel caso generale è di primo ordine se il valore è nullo e quindi l'ordine basato sul valore stesso come un tie-break.

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