↓の続きです
[C#][WPF]タイプセーフにINotifyPropertyChangedインターフェースのPropertyChangedイベントを発行する
上のリンクで紹介したテクニックを使えば、EntityFrameworkのIncludeメソッドがタイプセーフに呼べちゃいます。
では、早速見比べてみましょう。
まず、通常版
using (var ctx = new SampleEntities())
{
// Employeesと一緒にDepartmentsも読み込んでね
var emps = from emp in ctx.Employees.Include("Departments")
from emp;
foreach (var emp in emps)
{
Console.WriteLine(emp.Name + ": " + emp.Departments.Name);
}
}
個人的に、このDepartmentsを文字列で指定するのが嫌いでした。
それが、ラムダ式で与えることが出来るようになります。
まず、拡張メソッド
public static class Sym
{
public static string Str<TObj, TProp>(Expression<Func<TObj, TProp>> expression)
{
var outerMember = ((MemberExpression)expression.Body);
var sb = new StringBuilder();
while (outerMember != null)
{
// ちょっとむだかなぁ・・・とりあえずやっつけで書いたから、あとで見直さないと
sb.Insert(0, outerMember.Member.Name);
sb.Insert(0, ".");
outerMember = outerMember.Expression as MemberExpression;
}
return sb.Remove(0, 1).ToString();
}
}
public static class ObjectQueryExtensions
{
// ObjectQuery<T>の拡張メソッドでラムダ式を受け取るIncludeを定義
public static ObjectQuery<TObj> Include<TObj, TProp>(this ObjectQuery<TObj> q, Expression<Func<TObj, TProp>> expression)
{
return q.Include(Sym.Str(expression));
}
}
んで、これを使って、さっきのコードを書き直すと…
using (var ctx = new SampleEntities())
{
// Employeesと一緒にDepartmentsも読み込んでね
// このタイプセーフの指定のしかたは、すごくいい!!
var emps = from emp in ctx.Employees.Include(o => o.Departments)
from emp;
foreach (var emp in emps)
{
Console.WriteLine(emp.Name + ": " + emp.Departments.Name);
}
}
前回の例よりも、こっちのほうが使い方としては素敵かもしれない。
同じ要領で、ADO.NET Data ServiceのSetLinkメソッドもタイプセーフに出来るかな??
今度チャレンジしてみよう。