Linq嵌套或内部查询

时间:2018-11-20 09:20:22

标签: c# linq entity-framework-core

假设我有一个员工列表,每个员工都有几个项目。我可以使用以下方式来获得给定的员工:

var employee = employees.SingleOrDefault(x => x.Id == "id");

但是如何过滤员工的项目?

例如:

var employee = list
  .SingleOrDefault(x => x.Key == employeeKey && 
                        x.Projects.SingleOrDefault(p => p.Key == projectKey));

4 个答案:

答案 0 :(得分:2)

如果要在获得雇员后过滤Projects,则可以使用.Select()

var result = employees.Where(e => e.Id == id).Select(e => new Employee
            {
                Id = e.Id,
                Projects = e.Projects.SingleOrDefault(p => p.Key == projectKey)
            }).SingleOrDefault();

因此您可以一步获得所需的数据,但必须自己分配属性。

另一种方法是先获取Employee,然后过滤项目,例如BoredomOverload建议:

var employee = employees.SingleOrDefault(x => x.Id== "id");
employee.Projects = employee.Projects.SingleOrDefault(p => p.Key == projectKey);

通过任何一种方式过滤员工和该员工的项目。

答案 1 :(得分:0)

var employee = employees.SingleOrDefault( x => x.Id.Equals("id") && x.project.Equals("project") );

答案 2 :(得分:0)

使用类似Any()的LINQ方法

var employee = employees.SingleOrDefault(x => x.Id== "id" && x.Projects.Any(p => p.Id == "Id"));

此外,您正在基于员工ID x.Id== "id"进行过滤,并且大多数情况下,员工ID将是主键(本质上是唯一键),在这种情况下,仅通过Id进行过滤就足够了,我相信< / p>

答案 3 :(得分:0)

SingleOrDefault返回该对象(如果找到)或为null。因此,在您的情况下,它将返回所有员工,因为您没有进行任何测试。您只是说项目在那儿,然后返回它。

使用Any代替,如果存在或不存在,它将返回一个布尔值:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.Any(p => p.Key == projectKey));

如果他只有一个具有特定键的项目,则需要过滤:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.Count(p => p.Key == projectKey) == 1);

您也可以使用SingleOrDefault实现它,但使用null测试值:

var employee = list.SingleOrDefault(x => x.Key == customerKey && x.Projects.SingleOrDefault(p => p.Key == projectKey) != null);

如果您希望返回类型更具体,请使用select。

如果它不起作用,请尝试在列表中添加“包括”:

list.Include("Projects").... the rest of the query