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

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

ただいまの
回答率

87.59%

MVCにて複数テーブルの値を取得・表示したい。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,864

score 19

前提・実現したいこと

前提
・Controllerに該当するStudentInfoesController.cs、Modelに該当するStudentInfo.cs、Viewに該当するIndex.chtmlを作成
・DBのリレーションは下図の通り
実現したいこと
・Index.cshtmlにて、UserInfoテーブルのデータを取得・表示したい
DBは下図の通りです。
イメージ説明

発生している問題・エラーメッセージ

・下記ViewにてStudentNameは表示されているが、ClassNameは表示されない。

該当のソースコード

DBは下記の通りUserInfoの外部キーにStudentIdを据えています。
UserInfo

CREATE TABLE [dbo].[UserInfo] (
    [StudentId]  INT            NOT NULL,
    [UserInfoId] INT            NOT NULL,
    [ClassName]  NVARCHAR (128) NULL,
    PRIMARY KEY CLUSTERED ([UserInfoId] ASC),
    CONSTRAINT [FK_UserInfo_ToTable_3] FOREIGN KEY ([StudentId]) REFERENCES [dbo].[StudentInfo] ([StudentId])
);


StudentInfo

CREATE TABLE [dbo].[StudentInfo] (
    [StudentId]   INT            NOT NULL,
    [StudentName] NVARCHAR (128) NULL,
    PRIMARY KEY CLUSTERED ([StudentId] ASC)
);

ControllerではUserInfoと内部結合しており、SELECTにてStudentId,StudentName,ClassNameを取得、Index.cshtmlにアクセスした際、StudentName,ClassNameを表示する処理を行いたいです。
ここで、StudentId,StudentNameは正常に取得・表示出来ておりますが、ClassNameはNULLを返している状態です。
*該当箇所のみ抜粋

Controller部分
StudentInfoesController.cs

        public ActionResult Index()
        {
            List<StudentInfo> model = null;
            model = db.Database.SqlQuery<StudentInfo>(@"
                    SELECT
                    StudentInfo.StudentId,
                    StudentInfo.StudentName,
                    UserInfo.ClassName
                    INNER FROM
                    StudentInfo
                    JOIN
                    UserInfo
                    ON
                    StudentInfo.StudentId = UserInfo.StudentId
                    ").ToList();
            return View(model);
        }


View部分
Index.cshtml

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>生徒名簿</title>
</head>
<body>
    <table class="table">
        <tr>
            <th>
                生徒名
            </th>
            <th>
                クラス名
            </th>
        </tr>

        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.StudentName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.ClassName)
                </td>
            </tr>
        }
    </table>
</body>
</html>


Model部分
StudentInfo.cs

    public partial class StudentInfo
    {
        public int StudentId { get; set; }
        public string StudentName { get; set; }
        public string ClassName { get; set; }

        public virtual ICollection<UserInfo> UserInfo { get; set; }
    }

試したこと

・「サーバーエクスプローラー」→右クリック→「新しいクエリ」にてSQL単体を実行させたところ、ClassNameは取得出来ていた。
・SQL文にブレークポイントを置いて確かめたところ、ClassNameはNULLを返した。
・StudentInfoにて実行したCRUDををUserInfoでも実行したところ、StudentInfoのデータは取得・表示できた。
以上より、多重度が関係していると思ったのですが、多重度の違いによってデータの取得・表示が異なるのでしょうか。
助言いただけると幸いです、よろしくお願いいたします。

開発環境

ASP.NET MVC5.2.4
Entity Framework 6.2.0
Identity.Entity.Framework 2.2.2
DB:SQL Sever

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2020/10/01 20:35

    > .NETアプリケーション開発入門を参考にDB Firstにて2つのView”StudentInfoes”、”UserInfoes”を作成

    そのサイト、斜め読みしましたが、質問の話とは大幅に違うようですけど? テーブルの構造も分からないし、質問がテキトー&イイカゲンすぎ。質問本文だけ読めば分かるように書き直してもらえませんか。

    キャンセル

  • hayato208

    2020/10/01 23:14

    回答ありがとうございます。質問文を修正しましたのでお手数をおかけしておりますが、今一度確認お願いいたします。

    キャンセル

  • SurferOnWww

    2020/10/02 09:38

    DB の構造、正規化の方法から始まって、生 SQL を投げているところ、StudentInfo クラスの定義などもろもろ変です。

    最初の DB の設計段階に戻って、全面的に見直し・書き換えた方がよさそうですが、取りあえず全面書き換えは置いといて、生 SQL を投げるところまでは今のまま進めるとしても・・・

    SELECT クエリが間違っていませんか? SELECT... INNER FROM ... JOIN ... ON ... ではなくて SELECT... FROM ... INNER JOIN ... ON ... のはずです。

    > 「サーバーエクスプローラー」→右クリック→「新しいクエリ」にてSQL単体を実行させたところ、ClassNameは取得出来ていた。

    ということですが、試しに自分がそのような SQL を SSMS から発行しようとしたらエラーになったのですが?

    まずはそこ、次に StudentInfo クラスの定義が変です。自動生成されたものに手を加えたのですか?

    キャンセル

回答 1

checkベストアンサー

0

DB の構造、正規化の方法から始まって、生 SQL を投げているところ、StudentInfo クラスの定義などもろもろ変です。

最初の DB の設計段階に戻って、全面的に見直し・書き換えた方がよさそうですが、取りあえず全面書き換えは置いといて、生 SQL を投げるところまでは今のまま進めるとして・・・

2 点気が付いたところを書くと、

(1) SELECT クエリが間違っていませんか? SELECT... INNER FROM ... JOIN ... ON ... ではなくて SELECT... FROM ... INNER JOIN ... ON ... のはずです。

(2) StudentInfo クラスの定義が変です。Visual Studio のデザイナで自動生成されたものに手を加えたようですが、独自に Model を作ってそれを使うようにしてください。

上記を直せば動くと思います。以前、ADO.NET Entity Data Model を使って Microsoft のサンプルデータベース Northwind から EDM を作って使ったサンプルがあってので試してみました。

Northwind データベースの中で質問者さんの UserInfo, StudentInfo テーブルと構造がほぼ同じの Territories, Region を使います。

イメージ説明

SSMS で、作成した SELECT クエリで期待通りの結果が得られるかを確認。ちなみに、質問者さんが書いたような SELECT... INNER FROM ... JOIN ... ON ... にするとエラーになります。

イメージ説明

それを Action Method の DbContext.Database.SqlQuery の引数にコピペ。View に渡す Model は RegionViewModel という名前で自分で定義してそれを使う。

イメージ説明

View はスキャフォールディング機能を使って Visual Studio に自動生成させる。実行結果は以下の通り、SSMS での実行結果と同じになる。

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/02 18:41

    返答ありがとうございます。無事動きました。

    >>(1) SELECT クエリが間違っていませんか? SELECT... INNER FROM ... JOIN ... ON ... ではなくて SELECT... FROM ... INNER JOIN ... ON ... のはずです。
    申し訳ございません、仰るとおり私の記述したものでは動かなかったです。質問する際どこかでコピペミスしたようです。

    >>(2) StudentInfo クラスの定義が変です。Visual Studio のデザイナで自動生成されたものに手を加えたようですが、独自に Model を作ってそれを使うようにしてください。
    どうやら自動生成されるクラスはDBとの接続用みたいですね。新たにクラスを作成したら問題なく動きました。

    キャンセル

  • 2020/10/03 07:23

    上にも書きましたが、DB の構造、正規化の方法から始まって、生 SQL を投げているところ、見直すことをお勧めします。

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る