Frage
Ich möchte einen Ausdruck erstellen, die zu den erwarteten entsprechen würde ...
Expression<Func<ReferencedEntity, bool>> expected = (ReferencedEntity referencedEntity) => foreignKeys.Contains(referencedEntity.Id);
Expression<Func<ReferencedEntity, bool>> actual;
FOREIGN Typ ist ein List<object>
Hier ist, was ich habe, so weit und ich denke, es Expression.Call () -Methode verwenden würde, aber nicht sicher, wie man das macht.
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);
Danke für deine Hilfe.
Lösung
Hier ist die Lösung, die ich nicht ohne Samuel Vorschlag getan haben könnte, obwohl ...
/// <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;
}
Andere Tipps
Ich weiß nicht die Lösung, aber ich weiß, wie Sie es bekommen können. Erstellen Sie eine Dummy-Funktion, die in einem Expression<Func<ReferencedEntity, bool>>
nimmt und es Ihr Lambda passieren. Und mit einem Debugger können Sie prüfen, wie der Compiler den Ausdruck für Sie erstellt.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow