代码之家  ›  专栏  ›  技术社区  ›  bytebender

列表<object>。包含表达式树

  •  4
  • bytebender  · 技术社区  · 16 年前

    我想建立一个表达式,将等同于预期的。。。

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

    foreignKeys类型是一个 List<object>

    这是我到目前为止所做的,我认为它将使用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<TReferencedEntity, bool>>(????, entityParameter);
    

    谢谢你的帮助。

    2 回复  |  直到 16 年前
        1
  •  12
  •   bytebender    16 年前

        /// <summary>
        /// 
        /// </summary>
        /// <param name="foreignKeys"></param>
        /// <returns></returns>
        private Expression<Func<TReferencedEntity, bool>> BuildForeignKeysContainsPredicate(List<object> foreignKeys, string primaryKey)
        {
            Expression<Func<TReferencedEntity, bool>> result = default(Expression<Func<TReferencedEntity, bool>>);
    
            try
            {
                ParameterExpression entityParameter = Expression.Parameter(typeof(TReferencedEntity), "referencedEntity");
                ConstantExpression foreignKeysParameter = Expression.Constant(foreignKeys, typeof(List<object>));
                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<Func<TReferencedEntity, bool>>(containsExpression, entityParameter);
    
            }
            catch (Exception ex)
            {
                throw ex;
            }
    
            return result;
        }
    
        2
  •  8
  •   Samuel    16 年前

    我不知道解决办法,但我知道你如何得到它。创建一个接受 Expression<Func<ReferencedEntity, bool>>