2013-07-18 78 views
1

這裏使用時讓我的數據:如何避免重新創建對象使用LINQ

private List<Department> Data 
{ 
    get 
    { 
     return new List<Department> 
     { 
      new Department{ 
       Id = 1, 
       Name = "Tech", 
       Employees = new List<Employee>{ 
        new Employee{Name = "x", Id = 1 }, 
        new Employee{ Name = "y", Id = 2} 
       } 
      }, 
      new Department{ 
       Id = 2, 
       Name = "Sales", 
       Employees = new List<Employee>{ 
        new Employee{Name = "a", Id = 3}, 
        new Employee {Name = "b", Id = 4} 
       } 
      } 
     }; 
    } 
} 

,在這裏我得到的所有員工與他們相關部門的列表:

List<Employee> employees = (from department in Departments 
         let d = department 
         from e in d.Employees 
         select new Employee{ 
          Id = e.Id, 
          Name = e.Name 
          Department = d 
         }).ToList(); 

是什麼在困擾我是我必須重新創建我的Employee對象才能將相應的部門附加到它。有沒有一種方法可以寫我的LINQ語句,我不需要重新創建員工?

有可能是一個更好的方式來短語這個question--可以隨意讓我知道是有。

編輯 我走這條路的原因是,我存儲我的數據通過序列化我的部門:

[ 
    { 
     "Id":1, 
     "Name":"Sales", 
     "Employees":[{"Id":2,"Name":"x"},{"Id":1,"Name":"y"}] 
    }, 
    { 
     "Id":2, 
     "Name":"Tech", 
     "Employees":[{"Id":3,"Name":"d"},{"Id":4,"Name":"f"}] 
    } 

] 
+0

您可以標記兩個類序列化和序列化列表中,將保持該部門爲了與員工。 – terrybozzio

回答

1

它看起來像你想用LINQ來更新一個實例。這不是預期的用途。使用LINQ查詢您想要的實例,然後遍歷結果進行更新。 (非嵌套)循環不是邪惡的。

var query = 
    from d in Departments 
    from e in d.Employees 
    select new { Employee = e, Department = d }; 

foreach(var x in query) 
{ 
    x.Employee.Department = x.Department; 
} 
+0

謝謝!這很有幫助。 –

1

你不應該擺在首位這個問題 - 你應該全面構建你Employee情況下,您最初創建他們,而不是晚些時候 - 如果員工需要一個部門來使用,你應該添加一個構造函數,允許/約束了向它提供:

public Employee(int id, string name, Department department) 
{ 
    ... 
} 
+0

我不知道我的更新helps--但看看我的編輯 - 看我如何保存我的數據?我將如何完成我想要做的事情,數據是如何構造的? –

1

你可以,如果你真的,真的,使用let -clause的副作用,因爲賦值表達式返回一個值:

List<Employee> employees = (from department in Departments 
          from e in department.Employees 
          let _ = e.Department = department 
          select e).ToList(); 

而且我完全同意BrokenGlass ...

+0

感謝Dominic--這是helpful--我只是不知道如何使用我存儲我的數據的方式做到這一點。 –

+0

@ek_ny只是不要:-)使用foreach循環。 – sloth

+0

行..這實際上讓我微笑......謝謝。 –

1

使用let是冗餘的,在示例查詢中無用。

此外,LINQ是不是在這裏合適的工具。您希望影響您正在查詢的對象的狀態(即創建副作用),這通常不被推薦。

通過直接比較,這是你想要做什麼更好的選擇:

foreach(var department in Departments) 
foreach(var employee in department.Employees) 
    employee.Department = department; 

如果你能然而,你應該時刻做好部門分配你的員工添加到部門,無論是在Department類的AddEmployee方法,或者也許在一個Employee.Department屬性設定器

+0

謝謝@Eren - 我只是不確定如何用我存儲數據的方式來做到這一點。看到我的編輯... –

+0

那麼你應該只使用我上面建議的'foreach'方法。在這種情況下使用linq會使代碼複雜化。 –

相關問題