Anidamientos




Este fue un desafío con el que me encontré en el primer proyecto en el que participé al ingresar a IOMA, y la
solución mas prolija que encontré, fue la que expongo a continuación.
La idea de este apartado es aportar una forma prolija de hacer anidamientos de condicionales, cuando las
opciones superan la cantidad de variantes que uno puede manejar mentalmente. 
        
Primero el codigo que hace posible la magia:
        
public static class ExpressionExtensions
 {
     public static Expression> OrElse(
         this Expression> expr1,
         Expression> expr2)
     {
         var parameter = Expression.Parameter(typeof(T));
         var combined = Expression.OrElse(
             Expression.Invoke(expr1, parameter),
             Expression.Invoke(expr2, parameter));

         return Expression.Lambda>(combined, parameter);
     }
 }
        

El código que sigue es un ejemplo de como cargar cada condicional necesario en una función flecha (Lambda).
        
Expression> condicionEntidadPrincipal = h =>
      h.Nombre_Entidad_Afectadaa == nombreEntidad &&
      h.Entidad_Afectada_ID == entidadId;

 Expression> condicionJsonActual = h =>
     h.JSON_Actual.Contains($"\"IdUsuario\":{usuarioId}");

 Expression> condicionPerfilBorrado = h =>
     h.Nombre_Entidad_Afectadaa == "PerfilesUsuarios" &&
     h.Accion_Realizada == "Borra registro" &&
     (h.JSON_Anterior.Contains($"\"usuarioId\":{usuarioId}") ||
      h.JSON_Anterior.Contains($"usuarioId = {usuarioId}"));
        

Ahora que tenemos los condicionales, los podemos juntar de la siguiente forma.
        
 var combinedCondition = condicionEntidadPrincipal
 .OrElse(condicionJsonActual)
 .OrElse(condicionPerfilBorrado);
        

Finalmente podemos usar la variable como se muestra en el siguiente ejemplo.
        
 historial = context.CDARegistroAccionesUsuarios
    .Where(combinedCondition)                       
    .ToList();