LINQ查询中创建新对象

6

我有一个部门列表,每个部门都有一个员工列表。我需要返回此列表中在2015年1月15日之后入职的所有员工。但我需要返回一个“名册”列表,即List<Roster>。我需要帮助使用LINQ查询。

这是我的Department类

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>并且需要在结果中包含部门和员工信息。我不确定如何从Department对象和Employee对象获取一些数据来创建Roster类。谢谢。
3个回答

13
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对象字段。

警告: 如果员工分配到多个部门,则会重复计算。


这是一个完美的答案,但也许可以尝试添加一些文字来解释一下。 - Matt Rowland
我实际上遇到了一个错误。它告诉我当前上下文中不存在名称“x”。因此,我可以访问直接集合但无法访问其父级。 - Sam
@Sam 你是运行了原始代码还是进行了一些修改? - M. Buga
@M.Buga 我已经检查了好几次,确保它是正确的。但在最后一个选择之前,我似乎无法从集合中选择任何内容。 - Sam
如何从此查询中删除重复项? - Partha Mandayam

3

这个概念大致相似,但需要进行重构。

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

0
var rosters = employees.Where(e => e.HireDate > someDate)
               .Select(s => new Roster {
                     LastName = s.FirstName,
                     Dept = s.Department.DepartmentName

注意 - 为了使其正常工作,您需要将部门属性添加到员工对象中。
或者在员工和部门之间进行连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接