2010-12-23 14 views
0

abzufragen. Nach einigen Ratschlägen, wie man das schön mit Lambda-Ausdrücken macht.Lambda-Ausdruck, der versucht, eine Liste basierend auf einem anderen

Ich möchte eine Liste von Placements basierend auf einer Agentur erhalten. Ich möchte, dass die Placements die Position placement.agency! = Enthalten, aber wo placement.agencypersonnel die Mitarbeiter der Agentur enthält.

Also, wo die Platzierung ist für die Agentur nicht, aber es gibt Mitarbeiter aus der in einer anderen Agentur Platzierung beteiligt Agentur

Ich weiß nicht, wie auf der Grundlage der zweiten Bedingung abzufragen.

So etwas wie:

// agency is being passed in 
    var agencySupervisors = agency.AgencyPersonnel; 

    return agency.Placements 
      .Where(p => p.Supervisors.Contains(agencySupervisors)) 
      .Where(p => p.Agency != agency); 

bekomme ich, dass Enthält sollte auf ein einzelnes Objekt verweisen, statt einer Sammlung - weshalb sein erroring ist .. aber ich bin nicht sicher, wie es zu erhalten, überprüfen Sie alle Objekte in der Auflistung.

Haben auch seine ich die falsche Alle

return agency.Placements 
      .Where(p => agencySupervisors.Any<PlacementSupervisor>(p.Supervisors)) 
      .Where(p => p.Agency != agency); 

Hoffentlich habe gerade versucht, bin mit !!

Ein weiterer Schlüssel in den Arbeiten ist, herauszufinden, wie die Vermittlungsstelle und die Agentur Personaleinheiten miteinander in Beziehung stehen .. Ich denke, es ist auf AgencyPersonnelId = SupervisorId verknüpft, so denke ich, dass auch berücksichtigt werden muss mein Ausdruck.

Danke!

Bearbeiten: Wie gehe ich, wenn die Art der Objekte in den beiden Listen nicht identisch sind - aber ich weiß, dass die ID übereinstimmen wird. Muss ich einen Vergleicher schreiben und das irgendwie in den Ausdruck einbauen? dh. AgencyPersonnelId = SupervisorID

Ich habe versucht:

return placements 
       .Where(p => p.Supervisors.Any(supervisor => agencySupervisors.Any(ap => ap.AgencyPersonnelId == supervisor.SupervisorId))); 

Aber es mich keine Ergebnisse geben wird, so dass es offensichtlich falsch ist.

Bearbeiten: Eigentlich, wenn ich versuche, die Platzierungen in der zurückgegebenen Sammlung zu durchlaufen, bekomme ich eine Null-Referenz Ausnahme - so bin ich nicht sicher, ob es etwas mit meinem Ausdruck oder die Art, wie ich zurückkomme die Ergebnisse.

+1

Würde agency.Placements jemals Platzierungen enthält, die zu diesem agengy gehören nicht? Wenn nicht, hat Suprvisors Referenzen auf alle Placements, an denen sie beteiligt sind? –

+0

Hmm guten Punkt danke! Leider haben Supervisor keine Referenzen auf alle Placements, an denen sie beteiligt sind. – Jen

Antwort

0

Danke an alle für die Hilfe - Weil die Objekte waren von verschiedenen Typen Ich endete etwas anders zu tun - aber dann fand ich konnte ihre Ids für den Vergleich verwenden, so dass das Ergebnis war:

var agencySupervisors = (from ap in agency.AgencyPersonnel 
            where ap != null 
             select ap.AgencyPersonnelId).ToList(); 

      return 
       (from p in m_PlacementRepository.Linq orderby p.PlacementId select p) 
       .Where(p => p.Agency != agency) 
       .Where(p => p.Supervisors != null && p.Supervisors.Any(s => agencySupervisors.Contains(s.SupervisorId))); 

Plus als Mikael Recht darauf hingewiesen, war ich mit der falschen Sammlung in erster Linie beginnend :)

1

Sie schließen mit Any & Contains - versuchen, beide auf einmal

return agency.Placements   
    .Where(p => agencySupervisors.Any(supervisor => p.Supervisors.Contains(supervisor)) 
    .Where(p => p.Agency != agency); 
0

ich glaube, Sie es mit .Intersect auch tun können:

return agency.Placements 
     .Where(p => agencySupervisors.Intersect(p.Supervisors).Any() 
        && p.Agency != agency); 
Verwandte Themen