6

少し前にこの質問を投稿しましたが、私の問題に対する部分的な回答を得たので、より正確な回答を得ることを期待して、より多くの説明を投稿すると思いました. 私は2つのクラスを持っています:

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

私は、Lambda を使用して SmallCars を使用している従業員を無視して、バンが割り当てられているすべての従業員のみを取得しようとしています。次の行を試しました。

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

しかし、少なくとも 1 つのバンが従業員に割り当てられている場合、これはすべての従業員を取得します( ) すべての従業員がバンを持っているわけではないため、.Any試しても ( ) 何も返されません。.All

ネストされた Lambda を使用してこれを達成できるかどうか、考えはありますか?

ありがとう。

編集:

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 });
4

3 に答える 3

2

代わりにこれを試してください:

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

これは私が試したものです(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();
}

出力:

ここに画像の説明を入力

于 2011-02-26T22:40:58.373 に答える
0

クエリは正しいEmployeeです。バンが割り当てられている場合は、リターン シーケンスに が追加されます。質問がどこにあるのかよくわかりません。すべての従業員がバンを持っているわけではないので、クエリは何も返さないと思いますか? はいの場合、これはWhereオペレーターの実装になります。

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

述語はシーケンス内のすべての要素に適用され、要素がそれを満たす場合、シーケンスの一部として返されます。

于 2011-02-26T22:46:35.313 に答える
0

これは、あなたの望むことですか?(すべての従業員は少な​​くとも 1 台のバンを持っていますが、小型車は持っていません)

var EmployeesWithVans = AllEmployees
                        .Where(emps => emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.Van)
                                       && !emps.Cars.Any(cartype => cartype.CarType == Cars.CarTypes.SmallCar))
                        .ToList();
于 2011-02-26T22:45:14.433 に答える