studio - see cref c#
C#niega una expresión (3)
Publicación para referencia futura.
La respuesta de Danny Chen se puede hacer más genérica:
public static Expression<TFunc> Not<TFunc>(this Expression<TFunc> baseExpr)
{
var param = baseExpr.Parameters;
var body = Expression.Not(baseExpr.Body);
var newExpr = Expression.Lambda<TFunc>(body, param);
return newExpr;
}
Esta versión puede recibir una expresión con cualquier número de parámetros de entrada. Sin embargo, solo agrega un poco de facilidad de uso, ya que la Expresión probablemente se pasaría a una función como IEnumerable.Where
. De todos modos.
Estoy buscando una manera de negar una expresión usada para filtrar secuencias IQueryable
.
Entonces, tengo algo como:
Expression<Func<T, bool>> expression = (x => true);
Ahora deseo crear la expresión que daría como resultado (x => false)
, así que básicamente quiero negar la expression
.
El método de trabajo que me he encontrado funciona así:
var negatedExpression =
Expression.Lambda<Func<T, bool>> (Expression.Not(expression.Body),
expression.Parameters[0])));
Pero estoy casi seguro de que hay una mejor manera. ¿Podrías ayudarme? (algo como Not(expression)
, probablemente).
Que hay de esto
Expression<Func<bool>> expr = () => true;
Expression<Func<bool>> negated = () => !expr.Compile()();
Un método de extensión fácil:
public static Expression<Func<T, bool>> Not<T>(this Expression<Func<T, bool>> one)
{
var candidateExpr = one.Parameters[0];
var body = Expression.Not(one.Body);
return Expression.Lambda<Func<T, bool>>(body, candidateExpr);
}
Uso:
Expression<Func<int, bool>> condition = x => x > 5;
var source = Enumerable.Range(1, 10);
var result1 = source.Where(condition.Compile()); //6,7,8,9,10
var result2 = source.Where(condition.Not().Compile()); //1,2,3,4,5