はじめに
これらのクラスがあるとしましょう:
public class Door {
public string Label { get; set; }
}
public class House {
public string Address { get; set; }
public Door FrontDoor { get; set; }
}
現在、これらは Entity Framework 4 を使用して抽象化された、DB 内の単純なモデルです。したがって、順序付きリストを作成する必要がある場合は、House
次を使用できます。
dbObjectContext.Houses.OrderBy(h=>h.Name);
次に、 で注文したい場合はFrontDoor.Label
、次を使用できます。
dbObjectContext.Houses.OrderBy(h=>h.FrontDoor.Label);
問題
家のリストを表示する WPF DataGrid で使用するための並べ替えメソッドを作成するつもりです。メソッドのシグネチャは次のようになります。
IOrderedQueryable<TEntity> ApplySortingToQuery<TEntity>(bool ascending
,IQueryable<TEntity> finderQuery,string propertyPath)
オブジェクト型とプロパティ アクセス パス stringの知識を使用してOrderBy式を構築したいと考えています。TEntity
propertyPath
DataGrid では、並べ替えられるオブジェクトは typeHouse
であり、その列はAddressおよびFront Door Labelです。これで、DataGridのAddressSortMemberPath
列が に設定されましたAddress
。一方、Front Door Label列はFrontDoor.Label
です。
最初は、使用するOrderByif-else
式を決定するために使用できます。たとえば、次のようになります。
if (col.SortMemberPath=="Address") {
query=query.OrderBy(h=>h.Address);
} else if (col.SortMemberPath=="FrontDoor.Label") {
query=query.OrderBy(h=>h.FrontDoor.Label);
}
ただし、この機能は非常に一般的なものです。したがって、メソッドのSortMemberPath
ように参照して使用するユーティリティ関数は、それpropertyPath
を使用する他の多くのアプリケーションにとって大きな助けになります。
私はこのユーティリティ関数をいくらか作成するのに役立つこのテクニックAddress
を参考にしましたが、直接のプロパティ アクセス (つまり: ) のみが成功しますが、サブ プロパティへのアクセス (つまり: FrontDoor.Label
) は成功しません。
私を案内してください。