private static People FilterByMembership(BasicPerson[] candidates, Organization organization) { // Get the organization tree Organizations orgTree = organization.ThisAndBelow(); // Build a lookup table of this organization tree. For each person in 'people' // that has at least one membership in an organization in the lookup table, // add that person to the final result. Dictionary <int, BasicOrganization> lookup = new Dictionary <int, BasicOrganization>(); foreach (Organization org in orgTree) { lookup[org.Identity] = org; } // Get the list of all memberships Dictionary <int, List <BasicParticipation> > memberships = SwarmDb.GetDatabaseForReading() .GetParticipationsForPeople(LogicServices.ObjectsToIdentifiers(candidates)); People result = new People(); foreach (BasicPerson basicPerson in candidates) { bool memberOfOrganization = false; if (memberships.ContainsKey(basicPerson.Identity)) { foreach (BasicParticipation membership in memberships[basicPerson.Identity]) { if (lookup.ContainsKey(membership.OrganizationId)) { memberOfOrganization = true; } } } if (memberOfOrganization) { result.Add(Person.FromBasic(basicPerson)); } } return(result); }