Métodos Numéricos
Esta página cubre todos los métodos relacionados con números disponibles en ValiFlow<T>. Están definidos en NumericExpression<TBuilder, T> y ComparisonExpression<TBuilder, T>, y son accesibles directamente desde tu instancia del builder ValiFlow<T>.
Ejemplos: ValiFlow · Evaluators
Salvo que se indique lo contrario, cada método soporta 6 overloads numéricos: int, long, float, double, decimal y short. Los ejemplos a continuación usan int y decimal por brevedad — las mismas firmas aplican para todos los tipos soportados.
Cero
Zero
Pasa cuando el valor es igual a 0.
var rule = new ValiFlow<Order>()
.Zero(x => x.Quantity);
NotZero
Pasa cuando el valor es distinto de 0.
var rule = new ValiFlow<Product>()
.NotZero(x => x.Price);
Signo
Positive
Pasa cuando el valor es estrictamente mayor que 0.
var rule = new ValiFlow<Product>()
.Positive(x => x.Amount);
Negative
Pasa cuando el valor es estrictamente menor que 0.
var rule = new ValiFlow<Order>()
.Negative(x => x.Balance);
Comparación (valor constante)
GreaterThan
Pasa cuando el valor de la propiedad es estrictamente mayor que la constante indicada. Soporta 6 overloads numéricos.
var rule = new ValiFlow<Order>()
.GreaterThan(x => x.Total, 0m);
var rule = new ValiFlow<Product>()
.GreaterThan(x => x.Stock, 0);
GreaterThanOrEqualTo
Pasa cuando el valor de la propiedad es mayor o igual que la constante indicada.
var rule = new ValiFlow<Order>()
.GreaterThanOrEqualTo(x => x.Quantity, 1);
LessThan
Pasa cuando el valor de la propiedad es estrictamente menor que la constante indicada.
var rule = new ValiFlow<Product>()
.LessThan(x => x.Price, 1000m);
LessThanOrEqualTo
Pasa cuando el valor de la propiedad es menor o igual que la constante indicada.
var rule = new ValiFlow<User>()
.LessThanOrEqualTo(x => x.Age, 120);
EqualTo
Pasa cuando el valor numérico es exactamente igual a la constante indicada. Este es el overload de igualdad específico para números.
var rule = new ValiFlow<Product>()
.EqualTo(x => x.Score, 100);
Comparación entre Propiedades
Estos overloads comparan dos propiedades de la misma entidad entre sí. Aceptan cualquier tipo que implemente IComparable<T>, lo que los hace aptos para DateTime, decimal, int y tipos similares.
GreaterThan (entre propiedades)
Pasa cuando el valor de la primera propiedad es estrictamente mayor que el de la segunda.
var rule = new ValiFlow<Order>()
.GreaterThan(x => x.EndDate, x => x.StartDate);
GreaterThanOrEqualTo (entre propiedades)
var rule = new ValiFlow<Product>()
.GreaterThanOrEqualTo(x => x.Max, x => x.Min);
LessThan (entre propiedades)
var rule = new ValiFlow<Product>()
.LessThan(x => x.Price, x => x.Cap);
LessThanOrEqualTo (entre propiedades)
var rule = new ValiFlow<Order>()
.LessThanOrEqualTo(x => x.Quantity, x => x.Stock);
Rango
InRange
Pasa cuando el valor se encuentra dentro del rango inclusivo [min, max]. Soporta 6 overloads numéricos y una variante entre propiedades.
// Límites constantes
var rule = new ValiFlow<Product>()
.InRange(x => x.Score, 0, 100);
// Límites entre propiedades
var rule = new ValiFlow<Product>()
.InRange(x => x.Value, x => x.Min, x => x.Max);
Between
Alias / variante de InRange con semántica inclusiva. Úsalo cuando la intención se lee más naturalmente como descripción de rango.
var rule = new ValiFlow<User>()
.Between(x => x.Age, 18, 65);
IsBetweenExclusive
Pasa cuando el valor está estrictamente dentro del intervalo abierto (min, max) — ambos límites están excluidos. Soporta 6 overloads numéricos.
// 0 < Discount < 100
var rule = new ValiFlow<Product>()
.IsBetweenExclusive(x => x.Discount, 0, 100);
Tolerancia
IsCloseTo
Pasa cuando |valor - objetivo| <= tolerancia. Útil para comparaciones de punto flotante. Soporta float y double.
var rule = new ValiFlow<Product>()
.IsCloseTo(x => x.Weight, 0.5, 0.01); // dentro de ±0.01 de 0.5
var rule = new ValiFlow<Order>()
.IsCloseTo(x => x.Latitude, 40.7128, 0.001);
Paridad
IsEven
Pasa cuando el valor es divisible por 2. Soporta int y long.
var rule = new ValiFlow<Order>()
.IsEven(x => x.Quantity);
IsOdd
Pasa cuando el valor no es divisible por 2. Soporta int y long.
var rule = new ValiFlow<Product>()
.IsOdd(x => x.Id);
IsMultipleOf
Pasa cuando el valor es un múltiplo exacto del divisor indicado. Soporta int y long.
var rule = new ValiFlow<Order>()
.IsMultipleOf(x => x.Quantity, 5);
Extremos
MinValue
Pasa cuando el valor de la propiedad es igual al mínimo representable para el tipo (p. ej. int.MinValue, decimal.MinValue). Soporta 6 overloads numéricos.
var rule = new ValiFlow<Product>()
.MinValue(x => x.Priority);
MaxValue
Pasa cuando el valor de la propiedad es igual al máximo representable para el tipo. Soporta 6 overloads numéricos.
var rule = new ValiFlow<Product>()
.MaxValue(x => x.Priority);
Numéricos Nullable
Estos métodos manejan propiedades numéricas nullable (int?, long?, decimal?, double?, float?).
IsNullOrZero
Pasa cuando el valor nullable es null o 0.
var rule = new ValiFlow<Product>()
.IsNullOrZero(x => x.Discount);
IsNotNullOrZero
Pasa cuando el valor nullable no es ni null ni 0.
var rule = new ValiFlow<Product>()
.IsNotNullOrZero(x => x.Price);
Ejemplo combinado
La siguiente regla valida una entidad Product con una variedad de restricciones numéricas:
var rule = new ValiFlow<Product>()
.NotZero(x => x.Price)
.Positive(x => x.Price)
.InRange(x => x.Stock, 0, 10000)
.IsBetweenExclusive(x => x.Discount, 0, 100) // 0 < Discount < 100
.IsCloseTo(x => x.Weight, 0.5, 0.01); // dentro de ±0.01 de 0.5
bool isValid = rule.Evaluate(product);
// Construir la expresión para LINQ/EF Core
Expression<Func<Product, bool>> expr = rule.Build();
var availableProducts = dbContext.Products.Where(expr).ToList();
Mini ejemplos
1) Rango de precio + descuento
var regla = new ValiFlow<Product>()
.InRange(p => p.Price, 10m, 500m)
.IsBetweenExclusive(p => p.Discount, 0m, 60m);
2) Tolerancia para valores flotantes
var regla = new ValiFlow<SensorReading>()
.IsCloseTo(x => x.Temperature, 20.0, 0.25);