現在、ASP.NET 動的データ エンティティは、すぐに使用できるブール値または外部キーの関係でのフィルター処理のみをサポートしています。
行をフィルター処理するための値のドロップダウン リストに基づいて、カスタム フィルターを実装するにはどうすればよいですか?
現在、ASP.NET 動的データ エンティティは、すぐに使用できるブール値または外部キーの関係でのフィルター処理のみをサポートしています。
行をフィルター処理するための値のドロップダウン リストに基づいて、カスタム フィルターを実装するにはどうすればよいですか?
ASP.NET 動的データが使用する意図したテンプレート システムに適合するように、これを行う方法を考え出しました。
基本的に、これに関する問題は、コンパイル時に、フィルタリングされる可能性のある基になる列が何であるか、ましてや、それがどのタイプまたは列名であるかがわからないことです-解決策を実装するための道に私を導いた最初の手がかりは、 Filter コントロールにはすべて GetQueryable メソッドがあります
残念ながら、このメソッドはIQueryable
ではなくのインスタンスで機能IQueryable<T>
するため、標準の LINQ 演算子を単純に使用することはできません。必要なのは、動的に述語を作成する方法です (または述語のチェーンでも - この場合、私がやりたかったのは、個別のエントリを取得して並べ替えることだけでした)。IQueryable
残念ながら、Dynamic LINQ のすぐに使用できる実装はありません。したがって、式ツリーを使用する必要があります。この問題を解決する方法の 2 つ目のヒントは、IQueryable
オブジェクトが .Expressions コレクションを公開しているという事実です。
必要なことは、述語を表す式ツリーを作成し (この場合、distinct を選択するため)、それを にアタッチしてIQueryable
返すことです。これは確かに明白な作業でも簡単な作業でもありませんでした。また、式ツリーを理解するのは簡単ではありませんでしたが、問題を解決する方法はそこにありました。
where パラメーターを GridView のデータソースに追加するだけで、同様のことを行いました。ユーザーがドロップダウンから Color Code 9 を選択したとします。Page_Init で、パラメーターを設定します。
Parameter p = new Parameter { Name = "ColorSelection", Type = TypeCode.Int32, DefaultValue = "9" };
GridDataSource.WhereParameters.Add(p);
GridDataSource.Where = "ColorId == @ColorSelection";