0

はじめに

これらのクラスがあるとしましょう:

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式を構築したいと考えています。TEntitypropertyPath

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) は成功しません。

私を案内してください。

4

1 に答える 1

0

テクニックはずっとウェブにあります..(いつものように)

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

を使用して DLL をコンパイルしCSharpSamples.zip\LinqSamples\DynamicQuery\DynamicQuery\Dynamic.csSystem.Linq.Dynamic名前空間を使用可能にする必要があります。そうすれば、メソッドの実装は非常に簡単になります。

重要なキーワードはdynamic query... 適切な質問に対する適切なキーワードを見つけるのが難しい場合があります。

于 2013-02-15T09:33:56.113 に答える