linqのjoinを使って二つのlistを結合しようとしているのですが、出力されたlistの要素が少なく、疑問に思っていたところ結合には内部結合と外部結合があることを知りました。現在のコードだと、内部結合になっているため、ProjectDetailの中で、担当者IDが存在している三件分のデータしかリストに入っておりません。本来の意図としては、担当者IDが存在していないデータについては空白として扱いたいため、外部結合を実装しているのですがうまく実装できておりません。
参考サイト
お力添えいただけると幸いです。
結合はプロジェクトID(ProjectDetailクラスのProjectID、ProjectクラスのID)をkeyとして行いました。
下記コードは実装を簡略化したものですので、不備等ありましたら、コメントいただきたいです。
class ProjectDetail { public ProjectDetail(int ProjectID) { this.ProjectID = ProjectID; this.UserID = UserID; } public ID ProjectID { get; set; } // プロジェクトID public UserID { get; set; } //担当者ID }
class Project { public Project(int ID, int CompanyID,) { this.ID = ID; this.CompanyID = CompanyID; } public int ID { get; set; } //プロジェクトID public int CompanyID{ get; set; } // 会社ID }
//プロジェクトリスト var ProjectList = new List<Project>(); syainList.Add(new Project("1", "1",)); syainList.Add(new Project("2", "2",)); syainList.Add(new Project("3", "3",)); syainList.Add(new Project("4", "4",)); syainList.Add(new Project("5", "5",)); syainList.Add(new Project("6", "6",)); syainList.Add(new Project("7", "7",)); //プロジェクト詳細リスト var ProjectDetailList = new List<ProjectDetail>(); ProjectDetailList.Add(new ProjectDetail("1", "1")); ProjectDetailList.Add(new ProjectDetail("2", "2")); ProjectDetailList.Add(new ProjectDetail("3", "3"));
var JoinList = ProjectList.Join(ProjectDetailList, a => a.ID, b => b.ProjectID, (a, b) => new { projectID = a.ID, companyId = a.CompanyID, userID = b.UserID}) .GroupBy(x => x.CompanyId) .Select(x => new { CompanyId = x.Key}); //内部結合しているため、担当者IDが入っていない三件分のデータがリストに入っていない。
開発環境
VS2012
追記
公式リファレンス
通りにやってみたのですがエラー「匿名型のメンバー宣言子が無効です。」が出ています。
List<CompanyDisplay> companyList = new List<CompanyDisplay>(); var query = from Matter in m_matterList join Detail in m_detailList on Matter equals Detail.m_matterID into gj from subpet in gj.DefaultIfEmpty() select new { person.FirstName, PetName = subpet?.m_matterID ?? int.Empty };
回答1件
あなたの回答
tips
プレビュー