MySQL で LINQ を使う

このブログの MySQL の記事をまとめていると「あれ?意外に少ない」と気が付いて、ADO.NET 絡みでMySQLを扱うTipsでも追加しようかと探していたところなのですが、なんと、LINQ で MySQL を使えることを発見。と言いますか、「至高の技」の執筆中に確認しなかったのが痛恨の一撃。

MySQL :: MySQL 5.1 Reference Manual :: 20.2.4.5 Tutorial: Using an Entity Framework Entity as a Windows Forms Data Source
http://dev.mysql.com/doc/refman/5.6/en/connector-net-tutorials-entity-framework-winform-data-source.html

どうも、日本語の情報が少ないなぁと思っていたら、該当するマニュアルは英語版しかないみたいですね。mysql linq で検索するあまり日本語のページは引っ掛かりません。

ざっと、英語のマニュアルを読めば分かるのですが、手順は非常に簡単です。SQL Server を LINQ で使うのと同じように、MySQL も DataAdapter 経由で LINQ を使うことができます。.NET Framework v4.0 からは、ここの ADO.NET 絡みが大きく変わっているので、かなり楽になっています。

という訳で、簡単に手順など。C# でサンプルコードを書いていますが、VB でも同じことができます。

■ADO.NET Data Entity Model を作成

0. 最初に MySQL :: Download Connector/Net から、Connector/Net 6.4.4 をダウンロードして、インストールしておきます。

1.「新しい項目の追加」で「ADO.NET Entity Data Model」を追加します。

2.「データベースから生成」で「次へ」

3.「新しい接続」ボタンをクリック

4.「変更」をクリック

5.「MySQL Database」をクリックして「.NET Framework Data Prodvider for MySQL」を選択。

6.「接続のプロパティ」で、サーバー名などを設定

7.「詳細設定」ボタンをクリックしたあと、「Allow Zero Datetime」を「True」、「Convert Zero Datetime」を「Ture」」に変更しておく。
これは、MySQL の Datetime は「0000-00-00 00:00:00」が許されるのですが、.NET の Datetime は「1900-01-01」あたりが最小値なためにエラーがでるため、これを自動でコンバートします。
「Unable to convert MySQL date/time value to System.DateTime」という例外が発生したら、ここを設定してみてください。

8.後は、テーブルを選択してエンティティクラスを自動生成します。ここでは、wordpress のテーブルから作成しています。


ここまで出来れば普通にSQL Sever で使う時のように LINQ が使えます。どうやら、sqlite も同じパターンなので、後で試して見る予定です。

■LINQ で検索する

DataGridView を使って、単純に一覧を表示した例です。

private void button1_Click(object sender, EventArgs e)
{
	// 単純に post テーブルの内容を表示
	wordpressEntities ent = new wordpressEntities();
	var posts = from t in ent.wp_posts select t;
	dataGridView1.DataSource = posts;
}

 

公開されている記事だけを検索する例です。

private void button2_Click(object sender, EventArgs e)
{
	// 公開している記事一覧を表示
	wordpressEntities ent = new wordpressEntities();
	/*
		select id, post_date, post_title, post_status, post_type from wp_posts
		where post_status = 'publish' and post_type = 'post'
		order by post_date desc
		*/
	var posts = from t in ent.wp_posts
				where t.post_status == "publish"
				&& t.post_type == "post"
				orderby t.post_date descending
				select new { t.ID, t.post_title, t.post_date };
	// バインド
	dataGridView1.DataSource = posts;
}

 

そんな訳で、LINQ to MySQL(という名前ではないけれど)は簡単に利用できます。wordpress などの oss の場合には mysql が使われていることが多いので、解析したり修正したりするときには勢い php になってしまうんですよね。自分が python あたりが使えるようになると、また別なんでしょうが、どうせならば .NET 関係のツールで揃えられれば windows から扱うのも手軽になるかなと。特に gui は作り易いですからね。

簡単なデータ更新の話とか、統計用の SlimStat のテーブル調査なんかは後ほど時間を取ってやっていこうと思います。SlimStat は、CakePHP から SlimStat へアクセスする(準備) | Moonmile Solutions Blog で準備だけして、頓挫しているので .NET のチャートが使えると結構便利なので。

カテゴリー: C#, MySQL パーマリンク