List .Contains Expression Tree

Je voudrais construire une expression qui correspondrait à prévu …

Expression<Func> expected = (ReferencedEntity referencedEntity) => foreignKeys.Contains(referencedEntity.Id); Expression<Func> actual; 

foreignKeys est un type List

Voici ce que j’ai jusqu’à présent et je pense qu’il utiliserait la méthode Expression.Call () mais ne sait pas exactement comment s’y prendre.

 ParameterExpression entityParameter = Expression.Parameter(typeof(TReferencedEntity), "referencedEntity"); MemberExpression memberExpression = Expression.Property(entityParameter, "Id"); Expression convertExpression = Expression.Convert(memberExpression, typeof(object)); //This is becuase the memberExpression for Id returns a int. //Expression containsExpression = Expression.Call(???? //actual = Expression.Lambda<Func>(????, entityParameter); 

Merci pour ton aide.

Voici la solution que je n’aurais pas pu faire sans la suggestion de Samuel …

  ///  /// ///  ///  ///  private Expression> BuildForeignKeysContainsPredicate(List foreignKeys, ssortingng primaryKey) { Expression> result = default(Expression>); try { ParameterExpression entityParameter = Expression.Parameter(typeof(TReferencedEntity), "referencedEntity"); ConstantExpression foreignKeysParameter = Expression.Constant(foreignKeys, typeof(List)); MemberExpression memberExpression = Expression.Property(entityParameter, primaryKey); Expression convertExpression = Expression.Convert(memberExpression, typeof(object)); MethodCallExpression containsExpression = Expression.Call(foreignKeysParameter , "Contains", new Type[] { }, convertExpression); result = Expression.Lambda>(containsExpression, entityParameter); } catch (Exception ex) { throw ex; } return result; } 

Je ne connais pas la solution, mais je sais comment vous pouvez l’obtenir. Créez une fonction factice qui prend une Expression> et transmettez-la à votre lambda. Et en utilisant un débogueur, vous pouvez examiner comment le compilateur a créé l’expression pour vous.