none
Query Filter para todas las entidades (EF Core 3.1) RRS feed

  • Pregunta

  • Estoy implementando Borrado Suave y he agregado la columna "Eliminado" de tipo Bit a todas las entidades. Cuando dicha columna tenga el valor 1 indica que el registro ha sido borrado.  Necesito aplicar un Query Filter para todas dichas entidades y quiero hacerlo recorriendo las entidades a través del objeto ModelBuilder, buscando encontré el siguiente código:

    foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
    {
    	var eliminadoProp = entityType.FindProperty("Eliminado");
    
    	if (eliminadoProp != null && eliminadoProp.ClrType == typeof(bool))
    	{
    		var parameter = Expression.Parameter(entityType.ClrType, "p");
    		var filter = Expression.Lambda(Expression.Property(parameter, eliminadoProp.PropertyInfo), parameter);
    		//MutableEntityTypeExtensions.SetQueryFilter(entityType, filter);
    		entityType.SetQueryFilter(filter);
    	}
    }

    Sin embargo, esto me genera el siguiente filtro Where en el SQL:

    WHERE [p].[Eliminado] = CAST(1 AS bit)

    Pero quiero que me genere lo siguiente:

    WHERE [p].[Eliminado] <> CAST(1 AS bit)

    Entiendo que debo modificar el filter de la expresión lambda.

    Favor si me echan una  mano, muchas gracias.



    • Editado eduar2083 domingo, 23 de febrero de 2020 12:23
    domingo, 23 de febrero de 2020 12:21

Todas las respuestas

  • Puedes tratar de utilizar el método Expression.NotEqual, el cual te devuelve un objeto BinaryExpression que puedes encadenar con Expression.Lambda.

    Prueba a realizarlo de la siguiente manera:

    foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
    {
    	var eliminadoProp = entityType.FindProperty("Eliminado");
    
    	if (eliminadoProp != null && eliminadoProp.ClrType == typeof(bool))
    	{
    		var parameter = Expression.Parameter(entityType.ClrType, "p");
    		var filter = Expression.Lambda(Expression.NotEqual(parameter, eliminadoProp.PropertyInfo), parameter);
    		//MutableEntityTypeExtensions.SetQueryFilter(entityType, filter);
    		entityType.SetQueryFilter(filter);
    	}
    }

    domingo, 23 de febrero de 2020 12:41
  • Hola Raul,

    Hay un error.

    Creo que falta un parámetro.

    domingo, 23 de febrero de 2020 12:48
  • Se me ocurrió Negar la expresión:

    var filter = Expression.Lambda(Expression.Not(Expression.Property(parameter, eliminadoProp.PropertyInfo)), parameter);

    Y Con esto ya me genera:

    WHERE [p].[Eliminado] <> CAST(1 AS bit)

    Pero no estoy seguro si es del todo válido.

    domingo, 23 de febrero de 2020 13:03
  • Vaya, parece ser que tienen que ser dos objetos de tipo Expression... Lo unico que se me ocurre es probar esto:

    foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
    {
    	var eliminadoProp = entityType.FindProperty("Eliminado");
    
    	if (eliminadoProp != null && eliminadoProp.ClrType == typeof(bool))
    	{
    		var parameter = Expression.Parameter(entityType.ClrType, "p");
    
    		var property = Expression.Property(parameter, eliminadoProp.PropertyInfo);
    
    		var filter = Expression.Lambda(Expression.NotEqual(parameter, property), parameter);
    		//MutableEntityTypeExtensions.SetQueryFilter(entityType, filter);
    		entityType.SetQueryFilter(filter);
    	}
    }


    domingo, 23 de febrero de 2020 13:07
  • Lo probé y tira una Excepción en tiempo de ejecución:

    Lo dejaré de momento negando la expresión. Agradezco mucho tu apoyo, saludos.

    domingo, 23 de febrero de 2020 13:19