Entity FrameworkのEntity Data Modelにはナビゲーション プロパティというものがあり、データベース上で外部キー制約がついていた場合、その外部キーに紐づくデータを取得できます。
通常、ナビゲーション プロパティはそのプロパティにアクセスされた際に初めてデータアクセスが発生します。(なお、これをLazy Loadといいます。)
しかし、必ずナビゲーション プロパティにアクセスすることが分かっている場合、一緒に読み込みを済ませておきたいケースもあります。(なお、これをEager Loadといいます。)
そんなときに使用するのが、Includeメソッドです。
Include メソッド
クエリの結果に含める関連オブジェクトを指定します。
しかし、Includeメソッドの引数は文字列で、タイプミスなどをすぐには検出できません。よく訓練されたC#erとしては、型安全に指定したいですよね?
というわけで、拡張メソッドとして作ってみました。
public static ObjectQuery<T> Include<T, V>(
this ObjectQuery<T> query,
Expression<
Func<T, V>> expression)
{
var memberExp = expression.Body
as MemberExpression;
if (memberExp ==
null)
{
throw new ArgumentException();
}
var entityName = memberExp.Member.Name;
return query.Include(entityName);
}
使い方はシンプルで、次のようにラムダ式で指定します。
var context = new DatabaseEntities();
var persons = context.Persons.Include(x => x.Department);
本来は、引数に本当にナビゲーション プロパティを指定されているかどうかをチェックしたりも必要だと思いますが、とりあえずプロトタイプということで。
#Expressionからプロパティ名を取得する方法は、こちらの記事を参考にさせていただきました。
#INotifyPropertyChanged の実装 « ++C++; // 未確認飛行 C ブログ