2011-02-26 18 views
5

He publicado esta pregunta hace un tiempo pero recibí una respuesta parcial a mi problema, así que pensé en publicar más explicaciones con la esperanza de obtener una respuesta más precisa. Tengo 2 clases:Lambda con clases anidadas

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

Estoy intentando conseguir solamente Todos los empleados que tienen furgonetas asignados a ignorar aquellos con SmallCars utilizando Lambda, probé esta línea:

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

Pero ahora se pone todos los empleados si se asigna al menos una camioneta a un empleado (.Any) si intento (.All) no traerá nada, ya que no todos los empleados tienen Van.

¿Alguna idea de si esto se puede lograr usando un Lambda anidado?

Gracias.

Editar:

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

Parece que ella quiere Empleados que tampoco tienen un auto pequeño ... –

+0

usted no ha mencionado 'carID' etc. Sin embargo, he editado mi respuesta según su actualización. –

Respuesta

2

probar este lugar:

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(); 

Esto es lo que he intentado (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(); 
} 

Salida:

enter image description here

+0

esto devolvería a todos los empleados quién ** no ** tiene una camioneta - No creo que eso sea lo que OP quiere – BrokenGlass

+0

Sí, solo lo estaba probando y encontré que ... he cambiado mi código ... Gracias por señalarlo –

+0

@maya: He actualizado mi respuesta según su actualización –

0

¿Esto es lo que quieres? (todos los empleados con al menos una furgoneta, pero sin 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 consulta es correcta, se añade un Employee a la secuencia de retorno si se asigna una furgoneta. No estoy muy seguro de dónde está la pregunta, ¿cree que su consulta no arrojará nada ya que no todos los empleados tienen una camioneta? Si es así, esto sería la aplicación de un operador Where:

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

El predicado se aplicará a todos los elementos en su secuencia, si el elemento se cumple, se le devolverá como parte de la secuencia.

+0

@BrokenGlass @Femaref @Shekhar_Pro He añadido un ejemplo a la pregunta, ¿tiene sentido, una salida de una nueva lista de empleados con elementos de empleados que contengan automóviles del tipo van solo agregado? – Maya

Cuestiones relacionadas