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

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

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

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

LINQ

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

Q&A

解決済

2回答

3404閲覧

C# LINQ JOINの結果をList<>に格納する方法

---stax---

総合スコア148

C#

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

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

LINQ

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

0グッド

0クリップ

投稿2021/08/30 00:52

編集2021/08/30 01:34

EF CoreでDBと接続し、2つのテーブルをJOINした結果を他のスコープでList型として使用したいです。
以下JOIN部分のコードです。

C#

1var joinData = db.Books 2 .Join(db.Categories, 3 b => b.Id, 4 c => c.catId, 5 (b, c) => new {Book = b, Category = c}) 6 .ToList();

JOINした結果には戻り値がない?ので他のスコープでも使用するには
結果を格納するためのクラスを作成し(例としてJoinDataProp.csとします)、各プロパティにjoinDataの値を格納するのが
一般的かなと思うのですが、今回はjoinDataの結果をListとして扱いたいです。

以下のように初期化時に設定するのかと考えたのですが、
joinDataには複数の要素(テーブルにおけるレコード)があり、以下の例では1要素分の値しか格納できず悩んでいます。

C#

1List<JoinDataProp> testJoinData = new List<JoinDataProp> 2{ 3 new JoinDataProp {Id = joinData.Select(x => x.Book.Id)} 4  ... 5  ... 6}

このようなケースではどのように対応するのがよいでしょうか?
初歩的な質問で申し訳ありませんがアドバイスよろしくお願い致します。

追記
質問頂いたように、JOINした結果を受けるためだけのクラスとして
JoinDataProp.csに対応する各要素は作成して試すのは実施しています。

C#

1var joinDataProp = new JoinDataProp(); 2foreach(var item in joinData ) 3{ 4 joinDataProp.BookName = item.Book.BookName, 5 joinDataProp.Category = item.Category.CategoryName, 6} 7 8return joinDataProp

これだと結果は受け取れてほかの関数の引数に使ったり、ほかのスコープでも使えるのでよいのですが
JOINした結果を使用したい箇所(使用用途:UIコンポーネントのグリッドの表示データ)がListか配列での指定がされており、joinDataPropをListに変換する方法が分からず、JOINした結果をそのままListに格納できないかと考えていました。

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

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

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

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

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

Zuishin

2021/08/30 00:57

> JOINした結果には戻り値がない?ので他のスコープでも使用するには 戻り値とは何ですか?
退会済みユーザー

退会済みユーザー

2021/08/30 01:11

> 今回はjoinDataの結果をListとして扱いたいです。 どういう意味ですか?
---stax---

2021/08/30 01:15

ありがとうございます。 分かりにくくてすいません。 visualstudio上でですが var joinData はList<'a> joinDataとなっており、明示的に型を指定できず return (JoinしたList) のように記述できないので戻り値がないと記述致しました。 伝えたかったのはList<JoinDataProp> testJoinData = joinData というようにできれば戻りの型はJoinDataPropと指定できるのですが、var joinData はList<'a> joinDataとなっているので指定できないということです。 分かりにくかったらすいません・・・
Zuishin

2021/08/30 01:18

'a は匿名クラスの仮のクラス名です。 匿名クラスを使うのではなく、戻り値に使うための Book と Category をメンバーに持つクラスを作るのが良いと思います。
退会済みユーザー

退会済みユーザー

2021/08/30 01:18

> 結果を格納するためのクラスを作成し(例としてJoinDataProp.csとします)、各プロパティにjoinDataの値を格納するのが一般的かなと思うのですが、 理解力が無くてすみませんが、上記のようにしない理由がわかりません。
---stax---

2021/08/30 01:21

SurferOnWww 様 こちらも分かりにくくすいません。 C#var joinDataはToList()でListにはできているのですが varで受けているため、このコードブロックでしか使用できず、ほかのスコープでもList<>として扱いたいという意味で記述しました。 自分なりに調べてみたのですがJOINした結果は、結果を受けるため専用のクラスを作成し、(質問文でのJoinDataProp.cs)そのクラスのプロパティにJOINで得た結果を格納し、ほかのスコープで使用する例を見かけたのですが、この結果をListで受けたいというのが今回やりたいことです。
Zuishin

2021/08/30 01:23

匿名クラスが通じないということはただのコピペマンか。
---stax---

2021/08/30 01:38

Zuishin様 ありがとうございます。 質問内容追記致しました。 アドバイスいただいたように、Book と Category をメンバーに持つクラスとして(質問でのJoinDataProp)を作ってはいたのですが、そこから次のステップとしてListに変換するという部分が思いつかず、それならJOINした結果をその場でListに格納できないかと考えて今回の質問となりました。 分かりにくくてすいません。
Zuishin

2021/08/30 01:44

(b, c) => new {Book = b, Category = c}) ↓ (b, c) => new List<object> { b, c }
退会済みユーザー

退会済みユーザー

2021/08/30 01:49 編集

ここのコメントは回答欄に移動しました
退会済みユーザー

退会済みユーザー

2021/08/30 08:37

質問者さん、無言になってしまいましたが、回答が付いていますので、それ他に対するフィードバックを返してください。役に立った/多々かなったぐらいはすぐにでも返事できるのでは? 役に立たなかったならどこがダメだったかを書いてもらえると、より質問者さんが望むことに近い回答が出てくるかも。とにかく無言で放置は NG です。
---stax---

2021/08/30 09:08

遅くなって大変申し訳ございません。 しばらくPCを確認できておりませんでした。 先ほど頂いた回答を元に試して、所望の挙動を確認出来ました。 行き詰っていたので本当にありがとうございます。 Zuishin様が仰っていたようにJOINの箇所はよく理解出来ていないまま使用していたことが原因だと考えます。 初歩的な内容で申し訳ありませんでした。
guest

回答2

0

ベストアンサー

List<JoinDataProp>が得たいものとして、

C#

1var joinData = db.Books 2 .Join(db.Categories, 3 b => b.Id, 4 c => c.catId, 5 (b, c) => new JoinDataProp(b, c)) // 適切にコンストラクタを作ること。 6 .ToList();

var joinData はList<'a> joinDataとなっているので指定できないということです。

勝手になっちゃっているみたいな言い草ですが、
Joinメソッドの引数で(b, c) => new {...}とあなたが匿名クラスを指定しているのでList<'a>になっています。

投稿2021/08/30 01:35

編集2021/08/30 01:47
ozwk

総合スコア13551

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

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

---stax---

2021/08/30 09:10

回答ありがとうございます。 返信遅くなり申し訳ございません。 頂いた回答で所望の挙動を確認できました。 >>Joinメソッドの引数で(b, c) => new {...}とあなたが匿名クラスを指定しているのでList<'a>になっています。 この部分が自分で理解出来ておりませんでした。 教えていただきありがとうございます。
guest

0

(b, c) => new {Book = b, Category = c}
↓↓↓
(b, c) => new JoinDataProp {Book = b, Category = c}

とすればやりたいことができるのでは? JoinDataProp クラスに Book, Ctategory プロパティが含まれていることが前提ですが。

投稿2021/08/30 01:48

編集2021/08/30 01:49
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

---stax---

2021/08/30 09:17

回答ありがとうございます。 質問の書き方含め、わかりにくい点が多くご迷惑おかけしましたが、丁寧に対応していただき本当にありがとうございました。 今回の内容の理解が足りていなかった部分を再度勉強しようと思います。 この度はありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問