2009-03-19 11 views
2

Linqのどのような仕組みがこの状況のた​​めのものなのか分かりません。それを手動で行います。Linq to Sql、1つのクエリでネストされたデータ構造を取得する

------------Employees------------- 
EmployeeID Name -other columns- 

    ---------EmployeeSkills----------- 
    EmployeeID Skill -other columns- 

ので、各従業員が0以上のスキルを持つことができます。

はのは、私は2つのテーブルがあるとしましょう。従業員からの

私のテーブルの関係が設定されているので、私はちょうど従業員テーブルをforeachの可能性が私の目標は、メモリ内のデータ構造にこの情報を描画することです

class StaticEmployee 
    { 
     int EmployeeID;  
     string Name; 
     List<string> Skills; 
    } 
    List<StaticEmployee> employees = (???).ToList(); 

1つのSQLクエリを使用して(でdb.Employeesは従業員を選択しますが、EmployeeSkillsプロパティにアクセスすると、そのデータが最初のクエリで返されなかったため、すべての従業員レコードに対して別個のクエリが実行されます。また

、と私は、これまでSQLが懸念されるように行わ欲しいものを私は、左にクエリを実行している参加:

SELECT Employees.EmployeeID, Employees.Name, EmployeeSkills.Skill FROM Employees LEFT JOIN EmployeeSkills ON Employees.EmployeeID=EmployeeSkills.EmployeeID 

私に私のリストを取得しますが、私は手動で照合する必要があることスキルが2の従業員は2行を返すので、これを私のリストに入れてください。 これを行うLinq操作はありますか?

from employee in db.Employees 
select new 
{ 
    EmployeeID = employee.EmployeeID, 
    Name = employee.Name, 
    Skills = new List(
        from employeeSkill in employee.EmployeeSkills 
        select employeeSkill.skill 
        ) 
} 

答えて

4
var options = new DataLoadOptions(); 
options.LoadWith< Employees>(e => e.EmployeeSkills); 
context.LoadOptions = options; 
//retrieve employees, they will come loaded with EmployeeSkills 

以下の仮想的な例あなたの代わりにLINQクエリのバージョンを使用した場合、これは一回だけでなく、それらをロードします:

from employee in db.Employees 
select new 
{ 
    EmployeeID = employee.EmployeeID, 
    Name = employee.Name, 
    Skills = employee.EmployeeSkills 
} 
+0

これはよさそうだ - より良い、LoadWithが提供します私が知らなかった機能を備えた私は存在していた。 Upvoted。 これを確定するには、EmployeeSkillsの列の一部を返す方法(2番目の方法)がありますか(スキル列が必要です。その表の各列ではありません) – David

+0

Nevermind、 "Skills = employee.EmployeeSkills"を "Skills = employee.EmployeeSkills.Select(s => Skill)"に変更しました。マークされた回答。 – David

+0

補足として、DataOptionsをdatacontextの最初のものとして指定する必要があります。これは時々痛みを伴うことがあります。あなたが気づいたように、それは情報全体を読み込みます。これは必ずしも必要なものではありません。ほとんどの場合linqクエリを実行し、更新が必要な場合はloadoptionsのみを実行します。 – eglasius

関連する問題