Métodos de comparación y booleanos
Esta página documenta todos los checks booleanos, checks de nulidad, comparaciones de igualdad, verificaciones de tipos y comparaciones entre campos disponibles en ValiFlow<T>.
Ejemplos: ValiFlow · Evaluators
Checks booleanos
IsTrue(selector)
La propiedad seleccionada debe evaluarse como true.
var rule = new ValiFlow<User>()
.IsTrue(u => u.IsActive);
IsFalse(selector)
La propiedad seleccionada debe evaluarse como false.
var rule = new ValiFlow<User>()
.IsFalse(u => u.IsDeleted);
Checks de nulidad
NotNull(selector)
El miembro seleccionado no debe ser null. Lanza una excepción si el selector siempre produce un tipo de valor no anulable.
var rule = new ValiFlow<Order>()
.NotNull(o => o.CustomerId);
IsNotNull(selector)
Alias de NotNull. Se prefiere este nombre por consistencia con la convención de nomenclatura Is*.
var rule = new ValiFlow<Product>()
.IsNotNull(p => p.Name);
Null(selector)
El miembro seleccionado debe ser null.
var rule = new ValiFlow<User>()
.Null(u => u.DeletedAt);
IsNull(selector)
Alias de Null.
var rule = new ValiFlow<Order>()
.IsNull(o => o.CancelledAt);
Igualdad
EqualTo(selector, value)
La propiedad seleccionada debe ser igual a value. TValue debe implementar IEquatable<TValue>.
var rule = new ValiFlow<Order>()
.EqualTo(o => o.Status, "Active");
NotEqualTo(selector, value)
La propiedad seleccionada no debe ser igual a value.
var rule = new ValiFlow<Order>()
.NotEqualTo(o => o.Status, "Cancelled");
Verificaciones de tipo
IsInEnum(selector)
El valor seleccionado debe ser un miembro definido de su tipo enum. Esta verificación usa Enum.IsDefined y se evalúa en memoria.
Nota: Solo en memoria. Este método no es traducible a SQL por EF Core. Usa
ValiFlow<T>(noValiFlowQuery<T>) cuando esta condición sea necesaria.
var rule = new ValiFlow<Order>()
.IsInEnum(o => o.PaymentMethod);
IsDefault(selector)
El valor seleccionado debe ser igual a default(TValue) — es decir, null para tipos de referencia, 0 para tipos numéricos, DateTime.MinValue para DateTime, etc.
Nota: Solo en memoria. No es traducible a SQL por EF Core.
var rule = new ValiFlow<Booking>()
.IsDefault(b => b.CheckOutDate); // true cuando CheckOutDate == default(DateTime)
IsNotDefault(selector)
El valor seleccionado no debe ser igual a default(TValue).
Nota: Solo en memoria. No es traducible a SQL por EF Core.
var rule = new ValiFlow<Booking>()
.IsNotDefault(b => b.Id); // asegura que Id ha sido asignado
Comparaciones entre campos
Estos métodos comparan dos propiedades de la misma entidad entre sí. El tipo del selector TValue debe implementar IComparable<TValue>, lo que incluye DateTime, decimal, int, string, DateOnly, TimeOnly, DateTimeOffset y cualquier otro tipo comparable.
GreaterThan(leftSelector, rightSelector)
left > right — la propiedad izquierda debe ser estrictamente mayor que la derecha.
var rule = new ValiFlow<Booking>()
.GreaterThan(b => b.CheckOut, b => b.CheckIn);
GreaterThanOrEqualTo(leftSelector, rightSelector)
left >= right.
var rule = new ValiFlow<Product>()
.GreaterThanOrEqualTo(p => p.MaxPrice, p => p.MinPrice);
LessThan(leftSelector, rightSelector)
left < right.
var rule = new ValiFlow<Order>()
.LessThan(o => o.DiscountedPrice, o => o.OriginalPrice);
LessThanOrEqualTo(leftSelector, rightSelector)
left <= right.
var rule = new ValiFlow<Warehouse>()
.LessThanOrEqualTo(w => w.CurrentStock, w => w.Capacity);
Ejemplo práctico
La siguiente regla combina checks booleanos, de nulidad, igualdad, tipo y comparaciones entre campos para validar una entidad Booking:
var rule = new ValiFlow<Booking>()
// Id debe haber sido asignado (distinto del valor por defecto)
.IsNotDefault(b => b.Id)
// El nombre del huésped no debe ser null
.IsNotNull(b => b.GuestName)
// Solo se aceptan reservas confirmadas
.EqualTo(b => b.Status, BookingStatus.Confirmed)
// PaymentMethod debe ser un valor de enum válido
.IsInEnum(b => b.PaymentMethod)
// La reserva no debe estar cancelada
.IsFalse(b => b.IsCancelled)
// El check-out debe ser posterior al check-in
.GreaterThan(b => b.CheckOut, b => b.CheckIn);
var result = rule.Validate(booking);
if (!result.IsValid)
Console.WriteLine($"Reserva inválida: {result.ErrorMessage}");
Nota:
IsNotDefaulteIsInEnumson solo en memoria. Si pasas la salida deBuild()de esta regla a una consulta de EF Core, esas condiciones lanzarán una excepción de traducción. En ese escenario, evalúalas por separado en memoria después de la consulta a la base de datos, o reemplázalas con equivalentes traducibles por EF Core.
Mini ejemplos
1) Soft-delete + estado
var regla = new ValiFlow<Order>()
.IsFalse(o => o.IsDeleted)
.EqualTo(o => o.Status, OrderStatus.Confirmed);
2) Guard de fechas entre campos
var regla = new ValiFlow<Booking>()
.IsNotNull(b => b.CheckIn)
.IsNotNull(b => b.CheckOut)
.GreaterThan(b => b.CheckOut, b => b.CheckIn);