LINQ:SQL的EXISTS的模拟?

时间:2018-08-06 11:39:35

标签: c# linq

假设我在“员工”集合中有几个人:

Name  | Position | Age
------+----------+----
Tom   | Manager  | 35
Hank  | Driver   | 38
Harry | Driver   | 45
...   | ...      | ...
Mark  | Driver   | 30
----------------------

,如果他们中至少有40岁以上的车手,我想得到所有车手。     您能帮我完成我的LINQ吗?

UPD。我想使用单个LINQ来完成此任务,而性能无关紧要。所以决定

var allDrivers = Employees.Where(n => n.Position == "Driver").ToList();
return allDrivers.Any(n => n.Age > 40)
? allDrivers
: new List<Employee>();

很好,但是我不能将其标记为答案。

在这种情况下,我需要得到汉克,哈里和马克。因为他们都是车手,而哈利才45岁(> 40)。但是,如果哈里39岁,我将一无所获,因为在这种情况下,所有车手都不到40岁。

2 个答案:

答案 0 :(得分:3)

因此,如果我要解析“从字面上看,如果其中至少有一个年龄在40岁以上的司机,我想得到所有司机”

var allDrivers = Employees.Where(n => n.Position == "Driver").ToList();
return allDrivers.Any(n => n.Age > 40)
    ? allDrivers
    : new List<Employee>();

或类似的东西。

对于一次查询的功能疯狂:

(int maxAge, List<Employee> result) = Employees
    .Aggregate(
        (age: 0, list: new List<Employee>()), 
        (al, n) => n.Position == "Driver" 
            ? (Math.Max(al.age, n.Age), al.list.Concat(new [] {n}).ToList() 
            : al));

return maxAge > 40 ? result : new List<Employee>();

这只是您可以设置的PoC。但是请记住-在问自己是否可以的时候,不要忘记问自己是否应该:)

答案 1 :(得分:1)

如果您真的希望在一个声明中使用它(对我来说这是非常虚假的),则可以执行以下操作:

IEnumerable<Employee> result = 
     employees.GroupBy(n => n.Position)
              .Where(g => g.Key == "Driver" && g.Max(x => x.Age) > 40)
              .FirstOrDefault();

别忘了做

return result ?? Enumerable.Empty<Employee>();

如果您什么都没发现,则要返回空结果而不是null。