2015-05-22 29 views
5

Mam kwerendy, która powinna być uporządkowany tak:Pomiń ThenBy na pustych obiektów

var list = new List<MonthClosureViewModel>(); 
var orderedList = list 
    .OrderByDescending(x => x.Project) 
    .ThenByDescending(x => x.ChargeLine) 
    .ThenByDescending(x => x.DomesticSite) //<- x.DomesticSite might be null sometimes 
    .ThenByDescending(x => x.ChargeSite) //<- x.ChargeSite might be null sometimes 
    .ThenByDescending(x => x.RateGroup) 
    .ThenByDescending(x => x.ApprovedHrs) 
    .ThenByDescending(x => x.NotApprovedHrs); 

public class MonthClosureViewModel 
{ 
    public Project Project { get; set; } 
    public ChargeLine ChargeLine { get; set; } 
    public Site DomesticSite { get; set; } 
    public Site ChargeSite { get; set; } 
    public RateGroup RateGroup { get; set; } 
    public decimal Rate { get; set; } 
    public decimal ApprovedHrs { get; set; } 
    public decimal NotApprovedHrs { get; set; } 
} 

Ale jeśli jakiś obiekt jest null (całkowicie zgodne z projektem) ta kwerenda nie powiedzie się. Jak mogę umieścić wartości puste na końcu lub pominąć porządkowanie, jeśli obiekt ma wartość NULL?

DODANO:jak @ LasseV.Karlsen wspomniał, że MOGĘ mieć INNY problem. Naprawdę dostałem ArgumentNullException, ale powodem nie był jakiś obiekt był null (widziałem go w debugerze i fałszywie myślałem, że to był mój problem). Prawdziwy powód był @ RaphaëlAlthaus wspomniano, że nie wdrożyć IComparable<> w każdej z moich klas MonthClosureViewModel ...

Po Robiłem to wszystko zacząć działać zgodnie z przeznaczeniem, nawet jeśli obiekt jest null

+0

możesz nam powiedzieć * * jak to się nie powiedzie? Zasadniczo, jaki jest typ wyjątku, komunikat wyjątku i stos śledzenia? 'ThenByDescending' nie wyrzuci wyjątku, jeśli wynikiem wywołania tego delegata jest' null', więc musi być coś innego, co nie powiedzie się. –

+0

Czy "niepowodzenie" oznacza coś zupełnie innego, np. Tworzenie danych posortowanych w nieprawidłowej kolejności? –

+0

@ LasseV.Karlsen nie powiedzie się z 'ArgumentNullException'. 'ThenByDescending' wyrzuca go, gdy' source' lub 'selector' ma wartość null [łącze msdn] (https://msdn.microsoft.com/ru-ru/library/bb534736 (v = vs.110) .aspx). – Szer

Odpowiedz

3

spróbować zamówić przez złożonych właściwościach, jest (jak wymieniono) prawdziwy problem.

Aby było to możliwe trzeba będzie albo

  1. wdrożyć IComparable<T> na swoich zajęciach

  2. stosowanie innych przeciążenia OrderBy/OrderByDescending, które biorą również IComparer<TKey> jako argument (msdn dla Przeciążenie OrderBy)

  3. Użyj prostej właściwości złożonej nieruchomości w porządku według klauzuli (z zerowym czekiem. W tym przypadku nul check l staje się konieczne, aby uniknąć wyjątku null odniesienia):

na przykład:

.OrderByDescending(x => x.Project == null ? string.Empty : x.Project.Name) 
3

musisz określić defaultSite i defaultChargeSite aby być mniejsza lub większa niż wszystkich innych obiektów w swojej klasie

var list = new List<MonthClosureViewModel>(); 
var orderedList = list 
    .Where(x => x != null); 
    .OrderByDescending(x => x.Project) 
    .ThenByDescending(x => x.ChargeLine) 
    .ThenByDescending(x => x.DomesticSite==null?defaultSite:x.DomesticSite) //<- x.DomesticSite might be null sometimes 
    .ThenByDescending(x => x.ChargeSite==null?defaultChargeSite:x.ChargeSite) //<- x.ChargeSite might be null sometimes 
    .ThenByDescending(x => x.RateGroup) 
    .ThenByDescending(x => x.ApprovedHrs) 
    .ThenByDescending(x => x.NotApprovedHrs); 
+6

prawdopodobnie 'x => x.DomesticSite ?? defaultSite' zrobi to samo. Spróbuję tego – Szer

+0

masz absolutną rację –

+3

Myślę, że błędne założenie tutaj jest takie, że 'ThenByDescending' nie będzie w stanie obsłużyć' null', ale robi to, nie rzuca wyjątku, jeśli napotka 'null'. W związku z tym * nie jest to problem, który musimy rozwiązać *. Problem musi więc być gdzie indziej. –

Powiązane problemy