문제
예상과 동일시하는 표현을 만들고 싶습니다 ...
Expression<Func<ReferencedEntity, bool>> expected = (ReferencedEntity referencedEntity) => foreignKeys.Contains(referencedEntity.Id);
Expression<Func<ReferencedEntity, bool>> actual;
외국 키 유형은 a입니다 List<object>
여기에 내가 지금까지 가지고있는 것이 있으며 표현식 () 메소드를 사용하지만 정확히 어떻게 해야할지 잘 모르겠습니다.
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);
도와 주셔서 감사합니다.
해결책
여기 사무엘의 제안 없이는 할 수 없었던 해결책이 있습니다 ...
/// <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;
}
다른 팁
나는 해결책을 모르지만 어떻게 그것을 얻을 수 있는지 알고 있습니다. an을 가져가는 더미 함수를 만듭니다 Expression<Func<ReferencedEntity, bool>>
그리고 당신의 람다를 통과하십시오. 그리고 디버거를 사용하여 컴파일러가 어떻게 표현식을 만들 었는지 검사 할 수 있습니다.
제휴하지 않습니다 StackOverflow