2015-05-22 11 views
5

ich eine Abfrage haben, die so bestellt werden sollte:überspringen ThenBy auf NULL festlegbare Objekte

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; } 
} 

Aber wenn jedes Objekt null ist (total durch Design) diese Abfrage fehlschlägt. Wie kann ich Null-Werte am Ende setzen oder die Reihenfolge überspringen, wenn das Objekt null ist?

HINZUGEFÜGT: als @ LasseV.Karlsen erwähnt ich könnte ein anderes Problem haben. Ich habe wirklich ArgumentNullException, aber der Grund war nicht hinter einem Objekt waren null (Ich sah es im Debugger und fälschlicherweise dachte, dass es mein Problem war). Der wahre Grund war, als @ RaphaëlAlthaus erwähnt, dass ich nicht IComparable<> auf jedem meiner Klassen in MonthClosureViewModel geführt habe ...

Nachdem ich es alles getan habe, beginnen, wie beabsichtigt arbeiten, auch wenn Objekt null

+0

Können Sie uns sagen, * wie * es scheitert? Was ist der Ausnahmetyp, die Ausnahmebedingungsnachricht und der Stacktrace? 'ThenByDescending' wird keine Ausnahme auslösen, wenn das Ergebnis des Aufrufs dieses Delegaten 'null' ist, also muss etwas anderes fehlschlagen. –

+0

Oder bedeutet "fehlgeschlagen" etwas völlig anderes, als würden Daten in der falschen Reihenfolge sortiert? –

+0

@ LasseV.Karlsen es scheitert mit 'ArgumentNullException'. 'ThenByDescending' löst es aus, wenn' source' oder 'selector' auf null gesetzt ist (msdn link) (https://msdn.microsoft.com/ru-ru/library/bb534736 (v = vs.110) .aspx). – Szer

Antwort

3

Sie versuchen, mit komplexen Eigenschaften zu bestellen, das ist das eigentliche Problem (wie Sie erwähnt).

Um es möglich zu machen Sie haben werden, entweder

  1. IComparable<T> auf Ihre Klassen implementieren

  2. Verwendung andere Überlastungen von OrderBy/OrderByDescending, die nehmen auch ein IComparer<TKey> als Argument (msdn für die OrderBy-Überladung)

  3. Verwenden Sie eine einfache Eigenschaft der komplexen Eigenschaft in Ihrer Order by-Klausel (mit Null-Check. In diesem Fall ist die Null l Prüfung notwendig wird eine Nullreferenz Exception) zu vermeiden:

Zum Beispiel:

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

Sie werden defaultSite und defaultChargeSite werden entweder kleiner oder größer als alle anderen Objekte in ihrer Klasse definieren, müssen

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

wahrscheinlich 'x => x.DomesticSite ?? defaultSite' wird das gleiche tun. Ich werde es versuchen – Szer

+0

Sie haben absolut Recht –

+3

Ich denke, die falsche Annahme hier ist, dass 'ThenByDescending' nicht in der Lage sein wird, mit' null' zu behandeln, aber es tut, wirft es keine Ausnahme, wenn es trifft 'null'. Als solches, * das ist kein Problem, das wir behandeln müssen *. Das Problem muss also anderswo sein. –

Verwandte Themen