タイプセーフにアドホックな条件が指定ができるライブラリを作る場合、やっぱりExpressionsが無いとね〜(´д`;) (Compact FrameworkでExpressionsを使う)

データベースアクセスとかね(・ω・)
まあ、ようするにLINQ to SQLとかみたいなものを作りたい場合。
具体的には、式ツリーを評価して、そこからSQLを作成するようなライブラリを自作したいとか言う場合について。


式ツリーやラムダ式が無い言語、例えばJavaなんかで、アドホックな条件指定ができるO/R Mapperをタイプセーフを作りたいと言ったような場合にはどうするかと言えば。
エンティティクラスとは別に、クエリパラメータ用のメタ情報クラスなんかを一緒に作って(自動生成して)、それを使うなんていう方法が一般的でしょうか(・ω・)?
実際、いくつかのO/R Mapperではそんなことをしていますが。


ただ、これはタイプセーフにはなるんだけど、イマイチ記述が自然じゃないよな〜とかも思ったりして(´д`)
あと、アドホックな処理への対応という点で見た場合も、式ツリーを評価する方法に比べると汎用性に劣るかな、っとか。*1


っで、Javaでの話はとりあえずおいておくとして、ここで話をしたいのはCompact Frameworkの場合について。
Compact Frameworkでは、System.Linq.Expressionsをサポートしていないわけですが(´・ω・`)


…とか思っていたら、こんなのあったんだ(゚∀゚)
https://source.db4o.com/db4o/trunk/db4o.net/Libs/compact-3.5/System.Linq.Expressions/
db4oで使っているやつ(゚Д゚)?


とりあえず、試してみる。


まず、上記からソースをチェックアウト。
っでCompact Framework用のプロジェクトを作って、そのソリューションにSystem.Linq.Expressions-CF-2008.csprojを追加。*2
作成したプロジェクトからSystem.Linq.Expressions-CF-2008を参照設定についかして、以下の様なコードを記述。

// プロパティ名取得
public static string Name<TResult>(Expression<Func<TResult>> expr)
{
    PropertyInfo pi = ((MemberExpression)expr.Body).Member as PropertyInfo;
    return pi != null ? pi.Name : null;
}

// テスト用クラス
public class Hoge
{
    public int Foo { get; set; }
}

// 実験
[MTAThread]
static void Main()
{
    Hoge o = new Hoge();
    Debug.WriteLine( Name( () => o.Foo ) ); // 文字列「Foo」が出力される♪
}

実行すると、見事に文字列「Foo」が出力されましたヽ(´ー`)ノ


っということで、Compact FrameworkでもExpressionsが使えました。
あとは、ExpressionVisitorで式ツリーを評価しながらクエリを組み立てていくライブラリを作れば良いわけですよ、フフフ…。


っで、明日もお休みするので、後のこと(↑の話ではなくて、仕事の話)はヨロシクちゃーん( ・ω・)ノ

*1:まあ、ライブラリの作りにもよるんだけど、複数条件の組み合わせにどこまで対応しているかというような話で(・ω・)

*2:あと、System.Linq.Expressions-CF-2008.csprojはアセンブリ署名をつける設定になっているけど、そこはとりあえずオフ