Repository

Entity FrameworkのサンプルだとDaoじゃなくてRepositoryのほうが多い気がするのでDBアクセスを行うクラスをRepositoryと呼ぶことにします。自分の中ではどっちもおんなじですけど。

アプリでつくるRepositoryはこんな感じになります。

public class EmployeeRepository : RepositoryBase<MyObjectContext>
{
  public IEnumerable<Employee> SelectEmployeesBySalaray(decimal max, decimal min)
  {
    return Select<Employee>(() => MyResource.SelectEmployeesBySalaray, new {max, min});
  }
}

親クラスのRepositoryBaseはSomaが提供するクラス、型パラメータのMyObjectContextはEntity FrameworkのObjectContextの子クラス(SQL Serverから自動生成)、Employeeはエンティティクラス(SQL Serverから自動生成)、MyResourceはSQLを管理するリソースファイル(から自動生成されるクラス)。

SQLは、こんな感じで記述しておいてSQLコメントでバインド変数を示します。バインド変数は匿名型のプロパティとマッピングされます。

select * from employee where salary < /* max */1000 and salary > /* min */500

上のEmployeeRepositoryで

Select<Employee>(MyResource.SelectEmployeesBySalaray, new {max, min});

ではなく

Select<Employee>(() => MyResource.SelectEmployeesBySalaray, new {max, min});

としているのは、MyResource.SelectEmployeesBySalaray_oracleみたいなリソースが存在する場合に接続先のDBがOracleだったらそっちのリソースを使用するといった機能のための対応です。Expressionで渡すことで、「SelectEmployeesBySalaray」プロパティの値とともに「SelectEmployeesBySalaray」プロパティのメンバ名を取得できるようになるので。Expressionを使ってメンバの名前をとる方法はhttp://d.hatena.ne.jp/okazuki/20100106が参考になりました。
最初のバージョンではSQL Serverしか考えないのでこの機能は不要なのですが、来年にはOracleがEntity Frameworkをサポートするそうなので、そうなったときに困らないようにあらかじめ対応しておきます。