2

リモートの並べ替えとページングを使用して、グリッド(ExtJS)でユーザーのデータを表示しています。いくつかの注文があるグリッドがあるとしましょう。Orderエンティティは、Order {OrderNumber、Customer、Date、Address {Street、City、PostCode}}のようになります。顧客はNHによってリレーションとしてマップされ、アドレスはコンポーネントとしてマップされます。グリッドに表示されるデータは、OrderNumber、Customer.Number、Customer.Name、Date、Address.Street、Address.City、Address.PostCodeのような名前の列にフラット化されます。

ユーザーが並べ替える列を選択すると、グリッドがフィールド名をサーバーに送信します。サーバー側では、グリッドフィールド名に属するエンティティプロパティを逆方向に復元し、それが単なるコンポーネントなのか、それともリレーションなのかを判断し、CreateAlias+AddOrderなどを使用してCriteriaを構築する必要があります。このロジックは次のようなコードでいっぱいです。

if (gridField=="Customer.Name"){
  cri = cri.createAlias("Customer", "customerAlias");
  cri.AddOrder(Order.Asc("customerAlias.Name"));
}

これは非常に単純化されていますが、現時点では必然的にこのようになります。私はいくつかの一般的なよりスマートなソリューションを探しています。何かご意見は?私が今直面している問題は、エンティティプロパティ(ネストされたコンポーネントとリレーションを含む)を変換するための規則を設定できることですが、フィールドがコンポーネントまたはリレーションのようにマップされているかどうかを判断する方法が必要です。これはかなり重いでしょう....

4

2 に答える 2

1

かなり重いでしょう。単純な解決策はわかりませんが、これを何度も再利用する予定がある場合、または非常に堅牢なものが必要な場合は、リフレクションに基づいたシステムを構築できます。

いくつかの T4 テンプレートを使用する別の可能性もありますが、それは関連付けの問題ではなく、「文字列」の問題のみに役立ちます。

于 2009-07-26T21:33:38.113 に答える
0

どうですか:

cri = cri.CreateAlias( "Customer", "CustomerAlias" );
string sortProperty = gridField.Replace("Customer.", "CustomerAlias.");
cri.AddOrder( Order.Asc(sortProperty) );
于 2009-07-01T23:12:12.707 に答える