LINQを使ってMySQLにアクセスする

常々、LINQ を使うために SQL Server を使う必要があって、じゃあ、Linux+MySQLの組み合わせに対して C#+LINQ はどうアクセスすればよいのか?と思っていたのだが、いつの間にか Entity Framework 相当のもの、というか MySql.Data.EntityFramework が出来ていたらしい。

MySQL :: Download Connector/Net
https://dev.mysql.com/downloads/connector/net/

いきなり、Connector/Net 8.0.11 というバージョンが上がっていて(あちこちの記事は 6.x だったりするんだが)、どうやら4月頃にアップデートしている。

何ができるのというと、Redmine や WordPress の内部にある MySQL に LINQ を使って直接アクセスできるということだ。こんな感じに、wordpress の wp_posts テーブルにACCESSできる。

image

NuGet から MySql.Data.EntityFramework をインストールする

実は Oracle のサイトから、Connector/Net をインストールしなくても、NuGet にある。

image

プロジェクトのほうは、MySql.Data.EntityFramework をインストールすれば ok. MySql.Data も一緒にインストールされる。

MySQL のプロバイダをインストールする

EF 自体は、NuGet から取れるのだが、SQL Server のようにデザイナを使いたい場合は、MySQL for Visual Studio をインストールする。

MySQL :: Download MySQL for Visual Studio https://dev.mysql.com/downloads/windows/visualstudio/

これを入れると、EF で「新しい接続」を選択したときに “MySQL Database” ってのが出るようになる

image

MySQL のテーブルを取り込む

準備ができたら、プロジェクトに「ADO NET Entity Data Model」を追加する。

image

モデルのコンテンツの選択では、

  • データベースから EF Designer
  • データベースから Code First

が2つある。Designer は、*.edmx ファイルを作ってグラフィカルなテーブルが表示されるもの。特にグラフィック部分が要らないのであれば、Code First で十分だったりする。

image

「新しい接続」ボタンをクリックして、MySQL Database を選ぶと、接続先のサーバー名とかを入れる画面が出る。ここで「テスト接続」をして接続できることを確認しておく。

image

さて、実は Connector/Net 8.0.11 にバグがあるらしく、ここの「詳細設定」を押して、Ssl Mode の値を「None」にしておかないといけない。

image

マニュアルには SslMode はデフォルトで None なのだけど、初期値が間違っているらしく、次の取得するテーブルを選ぶところで落ちてしまうのだ。

SQL Server に LINQ するときと同じようにクラス化するテーブルを選ぶ。

image

redmine の projects と issues が無事取得できる。

image

これで LINQ が使えるので、

private void clickGetIssues(object sender, RoutedEventArgs e)
 {
     var ent = new RedmineModel.RedmineEntities();
     var q = from t in ent.issues
             where t.project_id == 10
             select t;
     lv.ItemsSource = q.ToList();
 }

とか

private void clickGetWpPosts(object sender, RoutedEventArgs e)
{
     var ent = new WordPressModel.WordpressEntities();
     ent.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
     var q = from t in ent.posts
             orderby t.post_date descending
             select new { id = t.ID, title = t.post_title, date = t.post_date }
             ;
     q = q.Take(30);
     lv.ItemsSource = q.ToList();
}

な感じで、MySQL へ LINQ を使ってアクセスができる。

ホスティングしている場合は wordpress の MySQL に直接アクセスはできないだろうけど、ローカルで作っているとか高速にページをアップするとか修正するときに便利かもしれない。

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