在LINQ查询中创建新对象

Sam*_*Sam 5 c# linq

我有一个部门清单.每个部门都有一份员工清单.我需要退回2015年1月15日之后被雇用的所有员工.但我需要返回"名册"列表,即List<Roster>.我需要LINQ查询的帮助.

这是我的系类

public class Department
{
   public int DepartmentId { get; set; }
   public string DepartmentName { get; set; }
   public List<Employee> Employees { get; set; } = new List<Employee>();
   public string Location { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的员工班看起来像这样:

public class Employee
{
   public int EmployeeId { get; set; }
   public Guid PersonId { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Gender { get; set; }
   public DateTime DateOfBirth { get; set; }
   public DateTime HireDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的名册班

public class Roster
{
   public int DepartmentId { get; set; }
   public string DepartmentName { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Gender { get; set; }
   public DateTime HireDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的查询到目前为止的样子:

var employees = departments.Where(x => x.Employees).Any(o => o.HireDate >= Convert.ToDateTime("1/15/2015")).Select(i => new Roster { ??? }).ToList();
Run Code Online (Sandbox Code Playgroud)

请记住,我想返回List<Roster>并需要在结果中包含部门和员工信息.我不知道如何从Department对象获取一些数据,而从Employee获取一些数据来创建Roster类.谢谢.

M. *_*uga 7

var rosters = departments.SelectMany(
    x => x.Employees
      .Where(y => y.HireDate >= Convert.ToDateTime("1/15/2015"))
      .Select(y => new Roster{ DepartmentId = x.DepartmentId, DepartmentName = x.DepartmentName, FirstName = y.FirstName, LastName = y.LastName, Gender = y.Gender, HireDate = y.HireDate})
  ).ToList();
Run Code Online (Sandbox Code Playgroud)

受欢迎的需求 - 解释:

departments.SelectMany(x => x.Employees…) - 在单个员工列表中加入所有部门的员工.

.Where(…) - 仅筛选在特定日期之后雇用的员工

.Select(y => new Roster{…})- Roster为每个选定的员工创建对象.此时,我们可以访问两个lambda变量(x- 表示部门,y- 员工),并可以使用它们来填充Roster对象字段.

警告: 如果将员工分配到多个部门,则会给出重复项.


Mar*_*rty 0

var rosters = employees.Where(e => e.HireDate > someDate)
               .Select(s => new Roster {
                     LastName = s.FirstName,
                     Dept = s.Department.DepartmentName
Run Code Online (Sandbox Code Playgroud)

注意 - 为此,您需要将部门属性添加到员工对象中。

或者在员工和部门之间进行连接