1

ここに私のデータがあります:

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 ステートメントを作成する方法はありますか?

この質問をより適切に表現する方法があるかもしれませんので、遠慮なくお知らせください。

編集 私がこの道を進んでいる理由は、部門をシリアル化してデータを保存しているためです。

[
    {
        "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"}]
    }

]
4

4 に答える 4

1

そもそもこの問題は発生しないはずです-Employeeインスタンスを最初に作成するときにインスタンスを完全に構築する必要があります。後でではなく、従業員が部門を使用する必要がある場合は、それを許可/強制するコンストラクターを追加する必要があります。

public Employee(int id, string name, Department department)
{
   ...
}
于 2013-07-18T12:43:04.200 に答える
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;
}
于 2013-07-18T12:52:00.557 に答える
1

代入式は値を返すため、本当に必要な場合は、let副作用に -clause を使用できます。

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

また、私はBrokenGlassに完全に同意します...

于 2013-07-18T12:45:55.213 に答える