2017-02-15 3 views
3

Ich habe folgendes Objekt:Zustand innerhalb linQ Wo Zustand

public class Result 
{ 
    public List<Recomendation> Recomendations { get; set; } 
} 

public class Recomendation 
{ 
    public List<Segment> Segments { get; set; } 
} 

public class Segment 
{ 
    public Leg OutBound { get; set; } 
    public Leg InBound { get; set; } 
} 

public class Leg 
{ 
    public TimeSpan TotalTime { get; set; } 
    public string Carrier { get; set; } 
    public int RefNumber { get; set; } 
} 

Ich habe eine Liste recommendations genannt

Ich brauche dies zu tun:

  • Filter recommendations durch das Auftreten einer Zeichenfolge arr in Carrier, innerhalb entweder der ausgehenden oder der eingehenden Objekte. Ich habe versucht, dies zu tun:

Suche Inbound allein:

var filteredList = recommendations.Where(r=>r.Segments.Any(x => x.InBound.Carrier.Contains(arr))).ToList(); 

oder suchen Outbound allein:

var filteredList = recommendations.Where(r=>r.Segments.Any(x => x.OutBound.Carrier.Contains(arr))).ToList(); 

Ich möchte für das Auftreten des Strings arr in BEIDE Inbound suchen und ausgehende.

Das Problem ist manchmal InBound kann Null oder OutBound kann Null sein. Ich möchte, dass mein linQ in beiden Fällen funktioniert.

Antwort

3

Sie müssen sicherstellen, dass der Code nicht brechen, wenn entweder Inbound oder Outbound null ist.

var filteredList = recommendations.Where(r=>r.Segments.Any(x => (x.OutBound != null && x.OutBound.Carrier.Contains(arr)) || (x.Inbound != null && x.InBound.Carrier.Contains(arr))).ToList(); 
+0

Dies funktioniert, wenn InBound und OutBound nicht null sind. Wenn Einer von ihnen Null ist, gibt es alle Elemente in Empfehlungen zurück – HelpASisterOut

+0

Ich musste den ersten Teil der Bedingung entfernen: x.Inbound == null || x.Outbound == null. überprüfe meine Antwort. Vielen Dank. – HelpASisterOut

+0

@HelpASisterOut Ich dachte, Sie benötigten, wenn Inbound und Outbound Null war – raven

2

Sie können dies tun, wenn Sie C# 6.0 verwenden:

var filteredList = recommendations.Where(r=>r.Segments.Any(x => x?.InBound.Carrier.Contains(arr) 
                   || x?.OutBound.Carrier.Contains(arr))) 
            .ToList(); 

Werfen Sie einen Blick Null-conditional Operators

0

Ich hatte @raven ‚s Antwort zu nehmen und es ein wenig zu ändern. Hier ist die Lösung:

var filteredList = recommendations.Where(r=>r.Segments.Any(x => (x.OutBound != null && x.OutBound.Carrier.Contains(arr)) || (x.Inbound != null && x.InBound.Carrier.Contains(arr)))).ToList();