質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

1回答

2263閲覧

linq(join)における外部結合の仕方

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

1クリップ

投稿2020/09/15 07:41

編集2020/09/15 09:08

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 };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/15 09:00

失礼いたしました。 読んで実装してみたのが、追記になります。
退会済みユーザー

退会済みユーザー

2020/09/15 09:05

参考にしている記事の URL の文字列を記載するだけでなくそこれのリンクを張ってください。でないとなかなか読んでもらえないかと。実は自分も読んでません。
退会済みユーザー

退会済みユーザー

2020/09/15 09:08

修正いたしました! ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/09/15 10:07

しっかり見たわけではないのでハズレかもしれませんが、エラーメッセージ「匿名型のメンバー宣言子が無効です。」は、 > select new { person.FirstName, PetName = subpet?.m_matterID ?? int.Empty }; の person.FirstName 部分を言っているような気がしますが? 違ったら失礼しました。
退会済みユーザー

退会済みユーザー

2020/09/15 11:18

ありがとうございます。 指摘「部分中心にもう一度見直してみます。
Zuishin

2020/09/15 14:05

int.Empty って何ですか?
436

2020/09/15 15:13

部分的でよくわかりませんが、on Matterがon Matter.IDではないでしょうか? MatterクラスらしきMatterと、intらしきDetail.m_matterIDが一致するわけないと素朴に考えました。 ただエラー内容的には違う気もしますが??? また、 PetName = subpet?.m_matterID ?? int.Emptyも、 PetNameが文字型と思われるのにint型を入れようとしてる気がします。。。
退会済みユーザー

退会済みユーザー

2020/09/15 20:12

> 指摘部分中心にもう一度見直してみます。 もうちょっとコードを見てみれば、「指摘部分」どころか、最初の ProjectDetail クラスからコンパイルも通らないと思うのですが?
guest

回答1

0

ベストアンサー

いろいろおかしいところがあるので、いろいろ直してみました。
UserIDがint型なので、存在しない場合を9999にしています。

C#

1 class ProjectDetail 2 { 3 public int ProjectID { get; set; } // プロジェクトID 4 public int UserID { get; set; } //担当者ID 5 } 6 7 class Project 8 { 9 public int ID { get; set; } //プロジェクトID 10 public int CompanyID { get; set; } // 会社ID 11 } 12 13 var ProjectList = new List<Project>() 14 { 15 new Project{ ID = 1, CompanyID = 11} 16 ,new Project{ ID = 2, CompanyID = 12} 17 ,new Project{ ID = 3, CompanyID = 13} 18 ,new Project{ ID = 4, CompanyID = 14} 19 ,new Project{ ID = 5, CompanyID = 15} 20 ,new Project{ ID = 6, CompanyID = 16} 21 ,new Project{ ID = 7, CompanyID = 17} 22 }; 23 24 var ProjectDetailList = new List<ProjectDetail>() 25 { 26 new ProjectDetail{ ProjectID = 1, UserID = 21} 27 ,new ProjectDetail{ ProjectID = 2, UserID = 22} 28 ,new ProjectDetail{ ProjectID = 3, UserID = 23} 29 }; 30 31 var query = ProjectList 32 .GroupJoin( 33 ProjectDetailList, 34 pt => pt.ID, 35 pd => pd.ProjectID, 36 (pt, pd) => new 37 { 38 ProjectID = pt.ID, 39 CompanyID = pt.CompanyID, 40 UserID = pd.Any() ? pd.FirstOrDefault().UserID : 9999 41 } 42 ); 43 foreach (var item in query) 44 { 45 Console.WriteLine($"ProjectID:{item.ProjectID}, CompanyID:{item.CompanyID}, UserID:{item.UserID}"); 46 } 47

投稿2020/09/16 00:22

kikukiku

総合スコア514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問