Comment construire une expression IEnumerable .Contains ()?

Je travaille actuellement avec ASP Dynamic Data pour la première fois et j’essaie de créer un filtre. Nos utilisateurs ont besoin de localiser des éléments dans une liste selon qu’il s’agisse ou non d’un enfant d’un parent sélectionné (nos articles peuvent avoir plusieurs parents).

Les éléments en question sont des segments et chaque segment a une propriété appelée RouteIds, de type IEnumerable, qui est une collection de tous les ID parents du segment.

Je suis arrivé à ce point en remplaçant la méthode GetQueryable dans mon filtre, mais des exceptions sont toujours générées sur la dernière ligne affichée:

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); 

L’idée est qu’un utilisateur sélectionnerait la route appropriée à partir d’une liste DropDownList, puis vérifierait si la propriété RouteIds du segment contient l’ID de cette route.

Des indications sur comment faire fonctionner cela?

Edit – Voici l’exception:

Aucune méthode générique ‘Contient’ sur le type ‘System.Linq.Enumerable’ n’est compatible avec les arguments de type fournis. Aucun argument de type ne doit être fourni si la méthode est non générique.

Il y a deux problèmes dans votre code:

  1. Vos parameters sont en arrière. Le premier paramètre doit être la collection, le second l’élément recherché.
  2. Votre argument type est IEnumerable , alors qu’il devrait être simplement int .

Donc, le code fixe est:

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

Mais il semble que toutes les parties de votre expression ne sont pas réellement dynamics, alors peut-être que quelque chose comme ça suivrait fonctionnerait aussi:

 Expression> expression = s => s.RouteIds.Contains(int.Parse(this.ddlRouteNames.SelectedValue));