【问题标题】:Creating a new object in LINQ query在 LINQ 查询中创建新对象
【发布时间】:2016-01-28 23:01:51
【问题描述】:

我有一个部门列表。每个部门都有一份员工名单。我需要返回此列表中 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&lt;Roster&gt;,并且需要在结果中包含部门和员工信息。我不确定如何从 Department 对象和 Employee 中获取一些数据来创建 Roster 类。谢谢。

【问题讨论】:

    标签: c# linq


    【解决方案1】:
    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 =&gt; x.Employees…) – 将所有部门的员工加入单个员工列表。

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

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

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

    【讨论】:

    • 这是一个完美的答案,但也许可以尝试添加一些文字来解释一下。
    • 我实际上遇到了一个错误。它告诉我当前上下文中不存在名称“x”。因此,我可以访问直接集,但不能访问其父集。
    • @Sam 您是否运行了确切的代码或进行了一些修改?
    • @M.Buga 我检查了几次,确保它是正确的。在最后一次选择之前,我似乎无法从集合中选择任何内容。
    【解决方案2】:

    大体思路与此类似,但应该重构

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

    【讨论】:

      【解决方案3】:
      var rosters = employees.Where(e => e.HireDate > someDate)
                     .Select(s => new Roster {
                           LastName = s.FirstName,
                           Dept = s.Department.DepartmentName
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多