2011-02-26 6 views
5

J'ai posté cette question il y a un moment mais j'ai eu une réponse partielle à mon problème, donc j'ai pensé que je posterais plus d'explications dans l'espoir d'obtenir une réponse plus précise. J'ai 2 classes:Lambda avec des classes imbriquées

public class Employee 
{ 
    public string Name { get; set; } 
    public List<Cars> Cars { get; set; } 
} 

public class Car 
{ 
    public int CarID { get; set; } 
    public CarTypes CarType { get; set; } 
    public enum CarTypes 
    { 
     Van, 
     SmallCar 
    } 
} 

J'essaie d'obtenir que tous les employés qui ont vans attribués à ignorer ceux qui SmallCars en utilisant Lambda, j'ai essayé cette ligne:

List<Employee> EmployeesWithVans = AllEmployees.Where(emps => emps.Car.Any(cartype => cartype.CarType == Car.CarTypes.Van)).ToList(); 

Mais cela devient tous les employés si au moins une fourgonnette est attribuée à un employé (.Any) si j'essaie (.All) cela ne rapportera rien car tous les employés n'ont pas Van.

Une idée si cela peut être réalisé en utilisant Lambda imbriqué?

Merci.

Edit:

Employee Mark = new Employee(); 
Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 12 }); 
Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 13 }); 
Mark.Cars.Add(new Car() { CarType = Car.CarTypes.SmallCar, CarID = 14 }); 

Employee Lisa = new Employee(); 
Lisa.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 15 }); 
Lisa.Cars.Add(new Car() { CarType = Car.CarTypes.SmallCar, CarID = 16 }); 
Lisa.Cars.Add(new Car() { CarType = Car.CarTypes.SmallCar, CarID = 17 }); 

    List<Employee> EmployeesWithVans should contain: 

    Employee FilteredMark contains: 
    Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 12 }); 
    Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 13 }); 

    Employee FilteredLisa contains: 
    Mark.Cars.Add(new Car() { CarType = Car.CarTypes.Van, CarID = 15 }); 
+0

On dirait qu'elle veut des employés qui n'ont pas aussi une petite voiture ... –

+0

vous n'avez pas mentionné 'carID' etc. mais j'ai édité ma réponse selon votre mise à jour .. –

Répondre

2

Essayez ceci:

List<Employee> Temp = AllEmployees.Where(emps => emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.Van)).ToList(); 

List<Employee> EmployeesWithVans = (from item in Temp 
      select new Employee{ 
            Name = item.Name, 
            Cars = (item.Cars.Where(car => car.CarType == Cars.CarTypes.Van)).ToList() 
           }).ToList(); 

C'est ce que j'ai essayé (en LINQPad):

void Main() 
{ 
    List<Employee> AllEmployees = new List<Employee>(); 

    List<Cars> lcars1 = new List<Cars>(); 
    Cars car1 = new Cars(); 
    car1.CarType = Cars.CarTypes.Van; 
    lcars1.Add(car1);lcars1.Add(car1); 

    Cars car2 = new Cars(); 
    car2.CarType = Cars.CarTypes.SmallCar; 
    lcars1.Add(car2); 

    List<Cars> lcars2 = new List<Cars>(); 
    lcars2.Add(car1);lcars2.Add(car2);lcars2.Add(car2); 

    AllEmployees.Add(new Employee(){ Name="emp1", Cars = lcars1}); 
    AllEmployees.Add(new Employee(){ Name="emp2", Cars = lcars2}); 
    AllEmployees.Add(new Employee(){ Name="emp3", Cars = lcars1 }); 
    AllEmployees.Add(new Employee(){ Name="emp4", Cars = lcars2}); 

    List<Employee> Temp = AllEmployees.Where(emps => emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.Van)).ToList(); 

    List<Employee> EmployeesWithVans = (from item in Temp 
      select new Employee{ 
             Name = item.Name, 
             Cars = (item.Cars.Where(car => car.CarType == Cars.CarTypes.Van)).ToList() 
           }).ToList(); 

    EmployeesWithVans.Dump(); 
} 

Sortie:

enter image description here

+0

cela retournerait tous les employés qui ** n'a pas ** une camionnette - je ne pense pas que c'est ce que l'OP veut – BrokenGlass

+0

ouais je ne faisais que l'essayer et j'ai trouvé que ... j'ai changé mon code .. Merci de le signaler –

+0

@maya: J'ai mis à jour ma réponse selon votre mise à jour –

0

Est-ce ce que vous voulez? (tous les employés ayant au moins une camionnette, mais pas smallcar)

var EmployeesWithVans = AllEmployees 
         .Where(emps => emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.Van) 
             && !emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.SmallCar)) 
         .ToList(); 
0

La requête est correcte, il ajoute une Employee à la séquence de retour si elle est assignée une camionnette. Je ne suis pas tout à fait sûr de la question, pensez-vous que votre requête ne retournera rien car tous les employés n'ont pas de fourgonnette? Si oui, ce serait la mise en œuvre d'un opérateur Where:

foreach(var elem in input) 
{ 
    if (predicate(elem)) 
    yield return elem; 
} 

Le prédicat sera appliqué à tous les éléments dans la séquence, si l'élément remplit, il sera retourné dans le cadre de la séquence.

+0

@BrokenGlass @Femaref @Shekhar_Pro J'ai ajouté un exemple à la question, est-ce logique, une sortie d'une nouvelle liste des employés avec des éléments de l'employé contenant des voitures de type van seulement ajouté? – Maya

Questions connexes