2

現在、ASP 動的データを初めて使用していて、フィルターを作成しようとしています。ユーザーは、アイテムが選択された親の子であるかどうかに基づいて、リスト内のアイテムを見つける必要があります (アイテムは複数の親を持つことができます)。

問題の項目はセグメントであり、各セグメントには IEnumerable 型の RouteIds と呼ばれるプロパティがあり、これはセグメントのすべての親 ID のコレクションです。

フィルターで GetQueryable メソッドをオーバーライドしてこの時点まで到達しましたが、表示されている最後の行で引き続き例外がスローされます。

ConstantExpression ce = Expression.Constant(int.Parse(this.ddlRouteNames.SelectedValue));
ParameterExpression pe = Expression.Parameter(source.ElementType);
MemberExpression me = Expression.Property(pe, this.Column.Name);
var callExpression = Expression.Call(typeof(Enumerable), "Contains", new Type[] { me.Type }, ce, me);

ユーザーが DropDownList から適切なルートを選択し、次にセグメントの RouteIds プロパティにそのルートの ID が含まれているかどうかを確認すると考えられます。

これを機能させる方法についての指針はありますか?

編集 - 例外は次のとおりです。

型 'System.Linq.Enumerable' のジェネリック メソッド 'Contains' は、指定された型引数および引数と互換性がありません。メソッドが非ジェネリックの場合は、型引数を指定しないでください。

4

1 に答える 1

2

コードには 2 つの問題があります。

  1. パラメータが逆です。最初のパラメータはコレクションでなければならず、2 番目のパラメータは検索するアイテムでなければなりません。
  2. あなたの型引数はIEnumerable<int>、ただでなければならないのに、ですint

したがって、固定コードは次のとおりです。

var callExpression = Expression.Call(
    typeof(Enumerable), "Contains", new[] { typeof(int) }, me, ce);

しかし、あなたの式のすべての部分が実際には動的ではないように見えるので、次のようなものもうまくいくかもしれません:

Expression<Func<Segment, bool>> expression =
    s => s.RouteIds.Contains(int.Parse(this.ddlRouteNames.SelectedValue));
于 2013-05-03T13:13:13.253 に答える