2013-07-18 113 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会使代码复杂化。 –

相关问题