More than 1 year has 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句でくくってたら怒られた

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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.