6

リストの順序付けを行うために、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();
}

これは機能しますが、子オブジェクト上にあるグリッドに公開する新しいフィールドまたはプロパティを追加するときに、このコードを更新する必要があることを意味します。

4

4 に答える 4

4

私があなたを正しく理解しているなら、私はあなたがこれを望んでいると思います:

repository.GetParentObjects()
    .OrderBy(p => p.Child == null ? "" : p.Child.Name);

LINQは、この式を模倣するSQLを生成できるようになります。

于 2009-09-18T14:49:31.880 に答える
2

解決策として、私の場合、式が子にアクセスするタイミングを検出し、並べ替え式を次のように変更するのは理想的ではないことがわかりました。

iif(Child == null,null,Child.Name) ASC

理想的には、このロジックをダイナミックライブラリに組み込むことができます。これが影響するすべてのケースを処理するために、各グリッドをあちこちで変更する必要はありません。

于 2009-09-18T14:30:36.843 に答える
1

私は同じ問題を抱えていましたが、私が見つけた最善の解決策は、コードを次のように変更して、コードをもう少し一般的にすることでした。

private void BindGrid()
{
    var sortField = this._sortField;
    var splitted_sortField = this._sortField.Split(new char[]{'.'}, StringSplitOptions.RemoveEmptyEntries);
    if (splitted_sortField.Length > 1)
    {
        sortField = "iif("+splitted_sortField[0]+"==null,null,"+sortField+")";
    }
    this.grid.DataSource = repository.GetWidgetList()
                                     .OrderBy(sortField + " " + this._sortDirection)
                                     .ToList();
}

完璧ではありません。子の子へのアクセスを許可するのは好きではありませんが、新しいnull許容の子を取得するたびにコードを更新する必要がなくなります。

于 2012-02-17T23:27:53.810 に答える
-2

私は問題を本当に理解していません(おそらくここではすでに金曜日の夜なので...)、しかしあなたはこのようにリストをソートすることはできません:

   myGrid.DataSource=repository.GetWidgetList()
     .OrderBy(w => w.SortField).ToList();

ここで、SortFieldは、並べ替えるプロパティです。これは、値がnullの場合でも機能するはずです...

それが完全に要点を超えている場合は申し訳ありません...

于 2009-09-18T14:45:26.287 に答える