Help us understand the problem. What is going on with this article?

Entity Framework6で単純なデータ表示フォームを作成

More than 3 years have passed since last update.

なかなか情報が見つからなかったので覚え書き。
MSDNにあったサンプルコードが動かなかった(EF5以前のものだった)ので。いいサイト、というかリファレンスあったら教えてください((
とりあえずSQL Server 2014 ExpressとVisual Studio 2015 Communityで作ってます。

テーブル構造

アーケードゲームのデータをまとめたものを想定

ModelID ModelName
機種ID(主キー) 機種名
TitleID ModelID VersionNO TitleName
タイトルID(主キー) 機種ID(外部キー) バージョン番号 タイトル名

コード

Modelの作成については省略。今回はデータベースからのCode Firstで作ってます。

MusicGameDataViewer.cs
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;

namespace EFSample
{
    public partial class MusicGameDataViewer : Form
    {
        MusicGame entities;

        public MusicGameDataViewer()
        {
            InitializeComponent();
            entities = new MusicGame();
            entities.Database.Log = sql => Console.WriteLine(sql); //コンソールに実行SQLを出力する
        }

        //データグリッドビューに機種名を表示
        private void btnShowModel_Click(object sender, EventArgs e)
        {
            dgvResult.DataSource = entities.Models.Select(model => new { model.ModelName }).ToArray();

            //カラム名設定
            dgvResult.Columns[nameof(Model.ModelName)].HeaderText = "機種名";
        }

        //データグリッドビューに機種名,バージョン名,稼動日を表示
        private void btnShowTitle_Click(object sender, EventArgs e)
        {
            dgvResult.DataSource = entities.Models.Join(entities.Titles,
                model => model.ModelID, title => title.ModelID,
                (model, title) => new { model.ModelName, title.TitleName , title.RunningDate }).ToArray();

            //カラム名設定
            dgvResult.Columns[nameof(Model.ModelName)].HeaderText = "機種名";
            dgvResult.Columns[nameof(Title.TitleName)].HeaderText = "バージョン名";
            dgvResult.Columns[nameof(Title.RunningDate)].HeaderText = "稼動日";
        }
    }
}

感覚としては単純にテーブルに対してLinqでデータ抽出すればいいだけなので、ToArray(),ToList()しないといけないことだけ気をつければ後は何も悩むことはなさそう。
あとはnameof()のおかげで文字リテラル記述する必要がない(+インテリセンスに全部任せられる)ってのは非常に楽ですね。

JOIN時の出力SQL

Result.sql
SELECT 
    [Extent1].[ModelID] AS [ModelID], 
    [Extent1].[ModelName] AS [ModelName], 
    [Extent2].[TitleName] AS [TitleName], 
    [Extent2].[RunningDate] AS [RunningDate]
    FROM  [dbo].[Model] AS [Extent1]
    INNER JOIN [dbo].[Title] AS [Extent2] ON [Extent1].[ModelID] = [Extent2].[ModelID]

まぁ、ホントに単純なJOINでしかないので、出力SQLもこんなものですね。もっと複雑なテーブル構造でどうなるかはまた確認したいところ。

やらかしたこと

-DbSet<T>をそのままDataSourceに放り込んで怒られる(NotSupportedException)
-DbSet<T>を直接ToArray(),ToList()したらやたら表示が遅延(一行ずつラグって表示)した。(誰か原因教えてください)
-メソッド内でentities宣言してusing句でくくってたら怒られた

思い出したら追記するかも。あとエラー処理とかろくにやってないので、改善すべきとこはいろいろあるはず。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした