resueltos expresiones ejercicios arboles arbol c# entity-framework linq lambda expression-trees

c# - ejercicios - Trabajar con tipos anulables en árboles de expresiones



arboles de expresiones (2)

Puede verificar si un tipo es anulable haciendo: if (typeof (T) .Equals (typeof (Nullable <>)) Creo y luego procedo a manejar eso especialmente. Si puede invocar el método GetValueOrDefault () de alguna manera, eso sería trabajo, o programable crear el valor de comparación para ser del mismo tipo tal vez.

HTH.

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. ¿Qué tengo que hacer?


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));