C# Linq嵌套查询或内部查询

C# Linq嵌套查询或内部查询,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,假设我有一个员工列表,每个员工都有几个项目。我可以使用以下方法获得给定员工: var employee = employees.SingleOrDefault(x => x.Id == "id"); 但我如何为员工筛选项目呢 例如: var employee = list .SingleOrDefault(x => x.Key == employeeKey && x.Projects.SingleOrDefaul

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

var employee = employees.SingleOrDefault(x => x.Id == "id");
但我如何为员工筛选项目呢

例如:

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

var employee=employees.SingleOrDefault(
x=>x.Id.Equals(“Id”)和&x.project.Equals(“project”)
);

使用
Any()
LINQ方法

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

此外,您是基于员工ID
x.ID==“ID”
进行筛选的,而且大多数情况下,员工ID将是主键(本质上是唯一的),在这种情况下,仅通过
ID
进行筛选就足够了,我相信如果您想在获得员工后筛选
项目
,您可以使用
.Select()

因此,您可以在一个步骤中获得所需的数据,但您必须自己指定属性

另一种方法是首先让您的
员工
,然后筛选项目,如:

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

无论采用哪种方式,都会对员工及其项目进行筛选。

如果找到或为空,SingleOrDefault将返回该对象。因此,在您的情况下,它返回所有员工,因为您没有测试任何东西。你刚才说如果项目在那里,就把它退回

如果存在或不存在,请使用将返回布尔值的任意值:

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

我需要按Id筛选项目Summine use
x.project.Id==Id
在员工实体或其他实体中执行项目之后(&Do)?是否要按Id筛选员工并按其Id筛选该员工的所有项目?或者仅通过
employee.Id
Project.Id
筛选员工。
.ToList()
是多余的,因为您只有一名员工。
list.Include("Projects").... the rest of the query