- PR -

親IDを指定したとき、子IDと関連するすべてのデータを取得したい。

1
投稿者投稿内容
めっち
会議室デビュー日: 2008/11/01
投稿数: 1
投稿日時: 2008-11-01 14:15
はじめまして。めっちといいます。
どういったLINQ式を組み立てたらよいか教示していただきたく書き込みしました。
よろしくお願いします。

■分類テーブル■
|分類ID|親ID|分類名
1 NULL キーボード
2 NULL マウス
3 1   有線式
4 1   無線式
5 4   電池式
6 4   充電式
7 2   レーザー式
8 2   ボール式
※一応最大5階層まで。

■商品テーブル■
|商品ID|商品名
1  Aキーボード
2  Bキーボード
3  Cキーボード
4  Dマウス

■商品・分類関連づけテーブル■
さらに、一つの商品が複数のカテゴリに該当することもあるので、リンクテーブルを作っています。有線式かつ無線式のキーボードは実際はないかもしれませんが。。。

|商品ID|分類ID
1(A)  3(有線式)
1(A)  5(無線式で電池式)
3(C)  6(無線式で充電式)
4(D)  7(レーザー式)

■質問■
このようなテーブルで、たとえば分類IDの1(キーボード)を指定した場合に、その小分類である有線式キーボードと無線式(電池式・充電式)キーボードの商品(AとC)を取り出したいのですが、どのようなLINQ式を組み立てたらよいのでしょうか。

また、そもそもこのようなテーブルの作り方が誤っているようでしたらご指摘下さればと思います。

■環境■
WindowsXP SP3
.NET Framework3.5
VisualStudio2008 Pro
なかむら
ベテラン
会議室デビュー日: 2008/11/11
投稿数: 67
お住まい・勤務地: 福岡
投稿日時: 2008-11-14 10:50
分類が5階層までと決まっているなら、分類テーブルを

| 分類ID | 分類名 |

という風に簡単にして、
分類1〜5それぞれに1つずつテーブルを用意し、
商品テーブルを

| 商品ID | 商品名 | 分類1ID | 分類2ID | 分類3ID | 分類4ID | 分類5ID |

としてもいいのでは?
「有線式」と「無線式で電池式」のキーボードは違う製品になる思います。

あと、参考までにめっちさんが挙げた例をそのまま LINQ にすると

コード:

var products = from class1 in context.分類
where class1.分類ID == 1
join class2 in context.分類 on class1.分類ID equals class2.親ID
join class3 in context.分類 on class2.分類ID equals class3.親ID
join map in context.関連付け on class3.分類ID equals map.分類ID
join product in context.商品 on map.商品ID equals product.商品ID
select product;



になりますが、分類テーブル同士を結合する回数は固定ではないので、
そのまま利用できませんね。


_________________
Nakamura Blog

[ メッセージ編集済み 編集者: なかむら 編集日時 2008-11-14 10:51 ]

[ メッセージ編集済み 編集者: なかむら 編集日時 2008-11-14 11:34 ]
1

スキルアップ/キャリアアップ(JOB@IT)