2016-01-28 20 views
4

我有一個部門列表。每個部門都有一份員工名單。我需要退回2015年1月15日之後聘用的所有員工。但是我需要返回「名冊」列表,即List<Roster>。我需要LINQ查詢幫助。在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>,並且需要在結果中包含部門和員工信息。我不知道如何從Department對象獲取一些數據,並且有一些來自Employee來創建Roster類。謝謝。

回答

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

注 - 對於這個工作,你需要部門屬性添加到employee對象..

或者讓員工之間的聯接和DEPTS

5
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對象字段。

警告: 如果員工被分配到多個部門,將會有重複。

+0

這是一個完美的答案,但也許嘗試,並添加一些文字來解釋一下。 –

+0

我實際上遇到錯誤。它告訴我,名稱「x」在當前上下文中不存在。所以,我可以訪問直接設置,但不能訪問其父設備。 – Sam

+0

@Sam你運行了確切的代碼或做了一些修改? –

1

總的想法是這樣,但它需要重構

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