🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

LINQ

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

Q&A

解決済

1回答

2062閲覧

[C#] LINQでテーブルをJOINする時、Many to Oneで結合したいですがうまくできません。

lovelydai

総合スコア38

C#

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

LINQ

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

0グッド

0クリップ

投稿2019/12/20 09:17

C#で簡単な練習用アプリを作っています。

したいことは、ある食べ物について、良いタイプと悪いタイプを表示したいです。
そのため、typesテーブルに4つのタイプを定義し、foodsテーブルに良いタイプと悪いタイプの2つフィールドを作りました。また、foodsテーブルのgoodtypeとbadtypeのフィールドをtypesテーブルのidへの外部キーとして設定しました。
こんな感じです。
イメージ説明

テーブルJOINを行い、結合したテーブルにintの値ではなく、typesテーブルに定義したtypename_enを表示したく、以下のようにLINQで書いてみました。が、上手く行きませんでした。(t.idに赤い下線、「医名型は、同じ名前を持つ複数の含むプロパティを含むことはできません。」と怒られます。)

何か解決策があれば教えてください。よろしくお願いいたします。

var query = (from f in foods join t in types on new { f.goodtypeid, f.badtypeid } equeals new { t.id, t.id }    order by f.id select new {   食品コード = f.id, 食品名 = f.foodname, 詳細 = f.foodmemo, 良い体質 = t.typename_en, 悪い体質 = t.typename_en }).ToList();

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/12/20 20:20

開発環境 (.NET Framework か Core どっちかとそのバージョン、Visual Studio のバージョンなど) を質問文を編集して書いてください。 医名型と書いてありますが匿名型の間違いですね?
guest

回答1

0

ベストアンサー

こんにちは。

クエリの内容が正しいかどうかを無視して、C# 的にどうすればよかったかという意味なら、こうです。

csharp

1var query = 2 from f in foods 3 join t in types 4 on new { goodid = f.goodtypeid, badid = f.badtypeid } // { int goodid, int badid } 5 equals new { goodid = t.id, badid = t.id } // { int goodid, int badid } 6 orderby f.id 7 select new 8 { 9 食品コード = f.id, 10 食品名 = f.foodname, 11 詳細 = f.foodmemo, 12 良い体質 = t.typename_en, 13 悪い体質 = t.typename_en 14 };

まずは、equals の行で id という名前を持つプロパティを複数持つ匿名型を作成しようとしているため質問のエラーが出ています。
匿名型に明示的に名前を振り分けることで解消できます。

次に、equals の前後の匿名型が持つプロパティの名前を一致させます。
異なるプロパティ名を持つ匿名型同士は別の型として扱われるため、一致させなければ比較ができません。


ところで、上のクエリは fgoodtypeidbadtypeid が一つの t.id にマッチすることを要求しているので、goodtypeidbadtypeid が等しいレコードのみが抽出されます。
動かしてないですが、本当はこんなことをしたかったのではないでしょうか。

csharp

1var query = 2 from f in foods 3 join good in types on f.goodtypeid equals good.id 4 join bad in types on f.badtypeid equals bad.id 5 orderby f.id 6 select new 7 { 8 食品コード = f.id, 9 食品名 = f.foodname, 10 詳細 = f.foodmemo, 11 良い体質 = good.typename_en, 12 悪い体質 = bad.typename_en 13 };

投稿2019/12/23 03:34

tamoto

総合スコア4237

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

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

lovelydai

2019/12/23 09:04

ありがとうございました。すごく分かりやすく、さらに分からなかったことまで説明して頂き、勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問