2009-05-04 4 views
4

Я хотел бы построить выражение, которое было бы приравнять к ожидаемому ...Список <object> .Contains Expression Tree

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>> и передает ей вашу лямбду. И используя отладчик, вы можете проверить, как компилятор создал выражение для вас.

+0

Как мне немного дальше ... Спасибо – bytebender

+0

Спасибо за вашу помощь дал вам upvote ... – bytebender

Смежные вопросы