Dapper.Netで1対多のマッピングをしてみよう。

タイトルの件、
ブログを書こうかな。と思い立ってググってみたら、

Dapper.Netで1対多のマッピングができるのか - けさらんぱさらん

既にトライしている方がいらっしゃいました。


既に公開されている情報ではありますが、
僕なりのやり方を書いておきます。


例えば、下のような2つのテーブルがあると仮定します。

親テーブル:MainData

CREATE TABLE [dbo].[MainData](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Title] [nchar](100) NULL,
 CONSTRAINT [PK_MainData] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


子テーブル:SubData

CREATE TABLE [dbo].[SubData](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[MainDataID] [int] NULL,
	[Title] [nvarchar](100) NULL,
 CONSTRAINT [PK_SubData] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


そして、MainDataクラスのプロパティとして、
SubDataをコレクションとして保持したい場合、

public class MainData
{
        /// <summary>
        /// SubDataのコレクションです
        /// </summary>
        public List<SubData> SubData { get; set; }

        /// <summary>
        /// Selectを実行します。
        /// </summary>
        /// <returns></returns>
        public IEnumerable<MainData> Select()
        {
            var mains = new List<MainData>();
            MainData current = null;

            StringBuilder query = new StringBuilder();
            query.AppendLine("SELECT * FROM MainData");
            query.AppendLine("LEFT JOIN SubData ON MainData.ID = SubData.MainDataID");

            SqlConnection con = new SqlConnection("接続文字列");

            con.Query<MainData, SubData, MainData>(
                        query.ToString(),
                        (main, sData) =>
                        {
                            // オブジェクトにマッピング
                            if (current == null || current.ID != main.ID)
                            {
                                mains.Add(main);
                                current = main;
                                current.SubData = new List<SubData>();
                            }
                            current.SubData.Add(sData);
                            return current;
                        },
                        this, splitOn: "ID");

            return mains;
        }
}

これで、使用側は

var m = new MainData();
var s = m.SubData;

って感じで参照できます。


ところで、
Visual Studio 2012 Expressがすごく便利だけど、
起動がアホみたいに遅い・・・。
2003の頃に戻ったみたいだ。。。

Visual Studio 2010 ExpressでもNuGetでDapperをインストールしたい

僕は基本的にシンプル派なので、
Dapperは気に入っている。


最近、.NET最先端技術によるハイパフォーマンスウェブアプリケーション という素晴らしい記事でも取り上げられていたので、Dapperに興味のある人は調べて見て下さい。


さて、私は開発環境にVisual Studio 2010 Expressを使用している。
Professionalは個人向けには少々お高いからだ。

関係ない話のようだが、rubyにはgemという素晴らしいパッケージ管理が存在する。

なぜ脈略の無い話を書いたかというと、
実は、Visual StudioにもNuGetというパッケージ管理が存在する。
だがしかし、Expressでは使用できないのだ。


DapperはNuGetのリストに入っている。NuGetでGetしたい。
GitHubから取得してコンパイルしても良いが、ちょっと面倒臭い。


いろんな諸事情(主に金銭面だろうが・・・。)でExpressを使用している人向けに、
ExpressでもNuGetを使用してDapperを使用可能にする手順を説明します。


まず、Nuget.exeを手に入れましょう。
こちらにアクセスし、
downloadsをクリック

f:id:alocoholic_babay:20130609225339p:plain

NuGet.exe Command Line bootstrapper
をクリック

f:id:alocoholic_babay:20130609225405p:plain

NuGet.exe Command Line
をクリック

f:id:alocoholic_babay:20130609225428p:plain


ダウンロードしたら、適当なフォルダに移動して下さい。
で、NuGet.exe自体を最新にするために、exeをクリックして実行して下さい。
プロンプトが表示されて、最新化が行われます。


最新化が終わったら、コマンドプロンプトを開き、NuGet.exeのフォルダまで移動して
下記コマンドを実行して下さい。

Nuget.exe install dapper

NuGet.exeのフォルダにDapperのフォルダが作成されていると思います。
Freamworkのバージョン毎にフォルダが分けられているので、
自分の環境に合ったdllを参照設定で追加すれば使用可能です。

macのgitではなくHomeBrewのgitが使いたいんだよ!

gitbreakが気になったので、C#とWenki.netの双方向通信ユーザコントロール
PassioneBrowserをPublicで公開してみました。


gitbreak


pushの際に、code 22が返って来て腹がたったので
gitをアップデートしようと思い、HomeBrewからインストール

バージョン確認

git --version
git version 1.7.9.6 (Apple Git-31.1)


・・・・・
いやいや、僕は1.8.2.1をインストールしたんだよ。
Apple?そんなのインストールした覚えはねぇ!

ちょっと調べてみたところ、XCodeさんが使ってるんですね。


困る人が結構いると思うので
対応方法をbashを知らない人向けに公開しておきます。

まず、アプリケーション > ユーティリティ > ターミナルを開きます
白いの出て来ましたか?

そしたら、下のコマンドをコピペしてリターンキーを押してください。

sudo vim ../../etc/paths

パスワードを聞かれるので、macにログインするパスワードを入力してエンターキーを押してください。
ちなみに、キーボードを押しても何も文字が入力されませんが、
キーは受け付けているので、勇気を出してエンターキーを押して下さい。


こんな画面になりましたね?
f:id:alocoholic_babay:20130601123917p:plain

今、pathsというファイルをvimというテキストエディタで開いて閲覧している状態です。

現在

/usr/bin             
/bin
/usr/sbin
/sbin
/usr/local/bin

となっている並び順を

/usr/local/bin
/usr/bin             
/bin
/usr/sbin
/sbin

に変更します。

"a"キーを押して下さい。
インサートモードに切り替わります。

そしたら、マウスやらトラックパッドやら使ってコピペして下さい。
キーボードしか無いっていう人はこんな記事読まないでしょう。

/usr/local/bin
/usr/bin             
/bin
/usr/sbin
/sbin

に書き換えたら、"esc"キーを押して下さい。
インサートモードを終了します。

":w"で保存して、":q"で終了です。

ターミナルを再起動
して、再度バージョン確認

git --version
git version 1.8.2.1

おぉ、良かった。

開発環境について

開発環境について、ちょっと書いておきます。


今まで、C#の記事を書いてましたが実はMacで開発しています。
PCの環境としてはこんな感じ
PC : Macbook Pro 13インチ Lion(corei5 / メモリ8Gに増設)
Windows環境 : VMWare Fusion5でwindows7 64bitを実行

Macを使う理由はいろいろあるのですが、
要約すると、好きだから。


Macbook購入直後はboot campでwindowsを実行してましたが、
再起動めんどくさい。
さらにLionからトラックパッドのスワイプでデスクトップを切り替えられるため、
VMWare Fusionで実行した方が便利。作業効率が全く違います。
メモリ増設 + VMWare Fusion5の購入費用は1万円でおつりがくるので、
迷っている方は是非導入しましょう。


パフォーマンスが気になる方、
Fusionにメモリを2G割り当てし、
SQLServer + Visual Studio Expressを使用して開発していますが、
結構サクサク動きます。

困ったことは、Visual Studio
Control(左Commandキー) + spaceでオートコンプリートが発動しないこと。
左Fn(Altにバインドされる) + →で呼び出しています。


Mac使っている人は、ほとんどの人が何らかの形でWindowsを動かしていると思うのですが、
最初からシームレスで使えるWindows.appみたいなのをオプションで付ければいいのに・・。
AppleもMicro Softも両方儲かるのでは・・・。

C#でwebkit 〜webkit.net使ってみる編〜

C#webkitwebkit.netをを実際に使ってみようじゃないか〜


前回の記事webkit.netをビルドしました。
今回は実際にこれを使用してみましょうという記事になります。
ビルド方法が知りたい方は、上記のリンクからどうぞ。


では、さっそく使ってみましょう。
今回の環境はWindows7 64bit, C# 2010 Express Editionです。


とりあえず、Windowsフォームアプリケーションのプロジェクトを作成しましょう。
名前は適当にWebkitSampleとでもしておきましょう。

前回、32bitでビルドをしているので、
ビルドの構成を変更します。
ツールバー > ビルド > 構成マネージャー
を開き下記のように設定して下さい。
もし、X86が見当たらない場合は、
アクティブソリューションプラットフォームから新規作成して下さい。

f:id:alocoholic_babay:20130509135228p:plain

この設定をせずに、Any CPU等の構成で64bit環境で実行を行うと、

ファイルまたはアセンブリ 'WebKitBrowser, Version=0.5.0.0, Culture=neutral, PublicKeyToken=b967213f6d29a3be'、またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。

の実行時エラーが発生します。


次にプロジェクトにフォルダを追加します。
ここではPackageという名前にしました。

f:id:alocoholic_babay:20130509132651p:plain


このフォルダに、前回作成した
webkitdotnet-develop\bin\Release\
内のファイルをコピーします。
(WebKitBrowserTest等のファイルは必要ありません。)
↓こんな感じです。

f:id:alocoholic_babay:20130509134150p:plain


これらのファイルはwebkit.netを使用するアプリケーションと同一の階層に存在する必要があります。
ビルドフォルダに直接設置しても良いのですが、
構成の変更時等に面倒くさいので、ちょっとおまじないをします。

事前準備として、まずソリューションを保存します。
ファイル > 名前を付けてWebkitSample(プロジェクト名)を保存
から適当な場所に保存して下さい。

保存が終わったら、プロジェクトのプロパティを開いて
ビルドイベントタブを開き
ビルド前に実行するコマンドラインに下記の文字列を設定して下さい。
もし、フォルダ名をPackage以外にしている場合は、自分の環境に合わせて変更して下さい。

copy $(ProjectDir)Package\*.* $(TargetDir)

f:id:alocoholic_babay:20130509135704p:plain

試しに、ビルドしてみましょう。
WebkitSample\bin\Debug
にファイルがコピーされていると思います。
構成をReleaseに変更した場合、自動的にbin/Releaseフォルダにコピーされます。

Failed to initialize activation contextと実行時エラー
が出る場合は、ビルドフォルダにファイルがコピーされている事を確認して下さい。


次の作業にうつります。
ソリューションエクスプローラ > 参照設定を右クリックし、参照の追加を行います。

参照タブを開き、Packageフォルダから
・WebKitBrowser.dll
・WebKitCore.dll

を選択します。


次にツールボックスを表示し、適当な場所を右クリックし
アイテムの選択をクリックします。
(ダイアログが表示されるまで結構時間がかかります。)

f:id:alocoholic_babay:20130509140740p:plain


参照ボタンをクリックし、PackageフォルダのWebKitBrowser.dllを選択します。
すると、ツールボックスにWebkitBrowserが追加されます。

f:id:alocoholic_babay:20130509141001p:plain


これをフォームにDrag & Dropしましょう。
↓こんな感じになります。

f:id:alocoholic_babay:20130509141506p:plain


これで使用準備は完了です。
実際に使ってみましょう。

フォームのコンストラクタを下記のように変更して下さい。

namespace WebkitSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webKitBrowser1.Navigate("http://google.com");
        }
    }
}

で、ビルドしましょう。

f:id:alocoholic_babay:20130509142100p:plain

(・ω・)< ヤッタ
無事に使えましたね!!


で、これを使って何をするの???

ただブラウザを作りたいのでしょうか。
世の中には、たくさんブラウザがあります。
自分で作ることはないでしょう。面倒ですし。


そして僕は思ったのです。
画面だけhtmlとCSS3とjQueryで作成して、ロジッックをC#で書けたらすごくね?便利じゃね?
と。


というわけで、C#とWebKitBrowserの相互通信を実現したパッケージを作成しました。
その名もPassioneBrowserKit
何ができるかというと、

・ブラウザ側で発生したイベント(例えばボタンのクリック)をC#側に通知できる。
C#側からブラウザ側のJavascriptを呼び出して、値の取得/設定が行える。

つまり、WindowsAPIをがっつり使いながらも、画面はhtmlとCSS3で描画するのでスーパーリッチなUIが実現できるのです。
たとえば、PCにインストールされているフォントをC#で取得して、
WebKitBrowserで表示させる。なんて事が簡単に実現可能です。


詳しくは、次回のブログに書きます。
先にソースコードだけ公開しておきます。
https://github.com/a-shinda/PassioneBrowserKit
ダウンロードしてビルドして実行すると、サンプルが起動します。
興味のある方は試してみて下さい。

質問等は、GitHubにメールアドレスがのっているので、そちらにお願いします。

C#でwebkit 〜webkit.netビルド編〜

C#webkitwebkit.netをビルド〜

visual studioで使えるWebBrowserコントロールは、IEエンジンを使用して動作しています。
これが非常に不便。ローカルのバージョンにいちいち左右されるし、何よりもCss3が使用できない。
これは困ったもんだ。どうしたものか…。


そうだwebkit.net使おう!


まずは、GitHubよりソースを取得しましょう。
https://github.com/webkitdotnet/webkitdotnet
にアクセスし、ZIPをクリックしてダウンロードしましょう。

f:id:alocoholic_babay:20130403161510p:plain


ソースが取得できたら、次はビルドします。
ビルド方法は、Wikiをクリックしても見ることができます。
英語が苦手な方は、この記事を見ながら一緒にビルドしましょう。
(このWikiの通りにやっても巧くいかなかったり…)

f:id:alocoholic_babay:20130403161807p:plain

今回のビルド環境はWindows7, C# 2010 Express Editionです。
他に、Visual C++ 2010 Express Editionも必要なので、まずはインストールして下さい。


まず、最初にC++で作成されているJSCoreプロジェクトをビルドします。
Visual C++ 2010 Express Editionを立ち上げて、
webkitdotnet-develop\JSCore\JSCore.vcxprojを開いて下さい。


立ち上げる際になんかエラーダイアログがたくさん出ますが、無視で。


立ち上がったら、
ツールバーから構成を変更しましょう。
下記画像のように、Release / Win32に設定します。

f:id:alocoholic_babay:20130403163546p:plain


設定が完了したら、ソリューションエクスプローラより、
ソリューションを右クリック > ビルド
して下さい。
ビルドが成功すると、
webkitdotnet-develop\bin\Release\JSCore.dll
が出力されます。


これでJSCoreのコンパイルは完了です。
Visual C++ 2010 Express Editionは終了して次の作業に移ります。


お次は、メインプロジェクトのビルドです。
Visual C# 2010 Express Editionを立ち上げて、
webkitdotnet-develop\WebKit.NET.sln
を開きましょう。


またまたエラーダイアログが大量に上がってきますが、
相変わらず無視しましょう。
とりあえず無視は大事です。


先ほどと同様にビルドの構成を変えたいのですが、
Visual C# 2010 Express Editionを立ち上げた状態だと
ツールバーに表示されていませんね…

まずは、
ツールバー > ツール > 設定 > 上級者設定にチェックをしましょう。
(上級者設定って…)


次に
ツールバー > ツール > オプションをクリック

f:id:alocoholic_babay:20130403165327p:plain

上記画像のように、

全ての設定を表示にチェックを入れる
プロジェクトおよびソリューションを選択し
ビルド構成の詳細を表示にチェックを入れて下さい。


ツールバーにビルドの構成が出てきたら、
またRelease / Win32に設定します。

f:id:alocoholic_babay:20130403165941p:plain


次に、
ツールバー > ビルド > 構成マネージャを開き

f:id:alocoholic_babay:20130403170330p:plain

のようにチェックを入れて、Win32構成のビルド対象として指定します。


まだ終わりません。
プロジェクトからdllへの参照が切れているので、修復します。
▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ

f:id:alocoholic_babay:20130403170713p:plain

WebkitCoreプロジェクトのJSCoreプロジェクトへの参照が切れているので、
右クリック > 削除しましょう。


そしたら、参照設定を右クリック > 参照の追加
から、先ほどVisual C++ 2010 Express Editionでコンパイルした
webkitdotnet-develop\bin\Release\JSCore.dllを指定します。

f:id:alocoholic_babay:20130403171052p:plain


同様の処理をWebKitBrowserTestにも行って下さい。
(削除して、先程コンパイルしたdllを指定。)
f:id:alocoholic_babay:20130403171351p:plain



できましたか?
長かったですね。本当に長かった。
では、ツールバー > ビルド > ソリューションのビルドを実行しましょう。


正常終了━━━━━━(゚∀゚)━━━━━━ !!!!!


では、サンプルプロジェクトを実行してみませう。
ソリューションエクスプローラで
WebKitBrowserTestを右クリック > デバッグ > 新しいインスタンスを開始
f:id:alocoholic_babay:20130403172016p:plain


この画面がでれば、全てのビルドは成功です。
おめでとうございます。
ありがとうございます。


次回(2013/05/09やっと更新しました...)は、このビルドされたdllを実際にC#から使用してみましょう。
お疲れさまでした!!

nQueryをGitHubに設置しました。

とりあえず、設置完了です。

https://github.com/a-shinda/nQuery

 

Windows FormでもjQueryのような記述でコントロールを動かす事ができます。

自由に使って下さい。

とりあえず、当面はC#のみです。

 

詳しい内容はまた今度。