2009-05-04 86 views
4

我想建立一個將等同於預期的表達......列表<object>。載表達式樹

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

感謝您的幫助。

回答

10

這裏是解決方案,我不可能做到這沒有薩穆埃爾的建議,但...

/// <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; 
    } 
8

我不知道解決方案,但我知道你是如何得到它的。創建一個虛擬函數,它接受Expression<Func<ReferencedEntity, bool>>並將它傳遞給你的lambda。使用調試器,您可以檢查編譯器如何爲您創建表達式。

+0

讓我有點進一步...感謝 – bytebender 2009-05-04 17:04:08