リストの順序付けを行うために、MicrosoftのDynamic Linq Library/Sampleを使用しています。たとえば、次のC#コードがあります。
myGrid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + sortDirection).ToList();
オブジェクトが別のオブジェクトと0:1の関係にあり、グリッドに表示される可能性のあるプロパティを持っている場合があります。これを並べ替えようとすると、すべてのウィジェットにこの子がある限り、正常に機能します。Child.Name
例えば注文しております。ただし、Childがnullの場合、null参照例外が発生します。
ここには、匿名型に選択してバインドできるオプションがいくつかあります。また、親オブジェクトでChild.Nameを公開し、コードを介してこれを処理することもできます(これは、このオブジェクトモデルを構成するのが好きではありません) )。
理想的な世界では、このケースを処理するためにライブラリを更新したいと思います。私がそれに飛び込む前に、誰かがこれに遭遇したかどうか、そしてすでに解決策を持っているかどうか疑問に思っていますか?
編集
説明が足りなかったようです。C#サンプルに付属しているDynamicLinqLibraryを使用しています。このライブラリは、ラムダ式の代わりに文字列を使用できるようにするいくつかの優れた拡張機能を追加します。したがって、私のコードは実際には次のようなものです。
private void BindGrid(sortField,sortDirection)
{
this.grid.DataSource=....OrderBy("MyField ASC")....
}
もちろん、そこにある文字列はパラメータに置き換えられます。ただし、これにより、ユーザーがグリッドヘッダーをクリックしたときに、並べ替えを動的に変更できます。そうでなければ、すべての順列を処理するロジックを実行する必要はありません。
以下に説明する私の解決策は、私のすてきなクリーンな方法を次のように変更します。
private void BindGrid()
{
var sortField=this._sortField;
if (sortField=="Child.Name")
{
sortField="iif(Child==null,null,Child.Name)";
}
this.grid.DataSource=repository.GetWidgetList()
.OrderBy(sortField + " " + this._sortDirection)
.ToList();
}
これは機能しますが、子オブジェクト上にあるグリッドに公開する新しいフィールドまたはプロパティを追加するときに、このコードを更新する必要があることを意味します。