在 LINQ 查询中创建新对象

本文关键字:对象 新对象 创建 LINQ 查询 | 更新日期: 2023-09-27 18:32:25

我有一个部门列表。每个部门都有一份员工名单。我需要从此列表中返回 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; }
}

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

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

这是我的花名册类

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

到目前为止,我的查询如下所示:

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

请记住,我想返回List<Roster>,需要在结果中包含部门和员工信息。我不确定如何从部门对象获取一些数据,从员工那里获取一些数据来创建花名册类。 谢谢。

在 LINQ 查询中创建新对象

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

根据大众需求 – 解释:

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

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

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

警告:如果员工被分配到多个部门,将提供重复项。

像这样的一般想法,但它应该被重构

        var departments = new List<Department>();
        var employees = new List<Employee>();
        var result = employees
                        .Where(e => e.HireDate >= Convert.ToDateTime("1/15/2015"))
                        .Select(e => new Roster
                        {
                            FirstName = e.FirstName,
                            LastName = e.LastName,
                            Gender = e.Gender,
                            HireDate = e.HireDate,
                            DepartmentId = departments.First(d => d.Employees.Any(ee => e.EmployeeId == e.EmployeeId)).DepartmentId,
                            DepartmentName = departments.First(d => d.Employees.Any(ee => e.EmployeeId == e.EmployeeId)).DepartmentName
                        });
var rosters = employees.Where(e => e.HireDate > someDate)
               .Select(s => new Roster {
                     LastName = s.FirstName,
                     Dept = s.Department.DepartmentName

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

或者在员工和部门之间建立联接