Trabajar con tipos anulables en árboles de expresiones

c# entity-framework expression-trees lambda linq

Pregunta

Tengo un método de extensión para filtrar dinámicamente los resultados de Linq to Entities utilizando valores de cadena. Funciona bien hasta que lo uso para filtrar columnas anulables. Aquí está mi código:

public static IOrderedQueryable<T> OrderingHelperWhere<T>(this IQueryable<T> source, string columnName, object value)
{
    ParameterExpression table = Expression.Parameter(typeof(T), "");
    Expression column = Expression.PropertyOrField(table, columnName);
    Expression where = Expression.GreaterThanOrEqual(column, Expression.Constant(value));
    Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table });

    Type[] exprArgTypes = { source.ElementType };

    MethodCallExpression methodCall = Expression.Call(typeof(Queryable), 
                                                      "Where", 
                                                      exprArgTypes, 
                                                      source.Expression, 
                                                      lambda);

    return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(methodCall);
}

Así es como lo uso:

var results = (from row in ctx.MyTable select row)
              .OrderingHelperWhere("userId", 5);//userId is nullable column

Aquí está la excepción que estoy obteniendo cuando uso esto para columnas de tabla que admiten nulos:

El operador binario GreaterThanOrEqual no está definido para los tipos 'System.Nullable`1 [System.Int32]' y 'System.Int32'

No pude entender esto. ¿Que debería hacer?

Respuesta aceptada

Tuve que convertir el tipo de valor al tipo de columna usando Expression.Convert:

Expression where = Expression.GreaterThanOrEqual(column, Expression.Convert(Expression.Constant(value), column.Type));


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow