List .Contains Expression Tree

我想建立一个等于预期的表达式……

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

foreignKeys类型是List

这是我到目前为止,我认为它将使用Expression.Call()方法,但不确定如何去做。

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

谢谢你的帮助。

如果没有塞缪尔的建议,这是我无法做到的解决方案……

  ///  /// ///  ///  ///  private Expression> BuildForeignKeysContainsPredicate(List foreignKeys, string 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; } 

我不知道解决方案,但我知道你怎么能得到它。 创建一个虚拟函数,它接受一个Expression>并将它传递给你的lambda。 使用调试器,您可以检查编译器如何为您创建表达式。