Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Working with nullable types in Expression Trees

I have an extension method to dynamically filter Linq to Entities results using string values. It works fine until I use it to filter nullable columns. Here's my code:

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

Here's how I use it:

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

Here's the exception I'm getting when I use this for nullable table columns:

The binary operator GreaterThanOrEqual is not defined for the types 'System.Nullable`1[System.Int32]' and 'System.Int32'

I couldn't figured this out. What should I do?

like image 719
dstr Avatar asked Oct 06 '10 11:10

dstr


2 Answers

I had to convert the value type to the column type using Expression.Convert:

Expression where = Expression.GreaterThanOrEqual(column, Expression.Convert(Expression.Constant(value), column.Type)); 
like image 140
dstr Avatar answered Oct 05 '22 15:10

dstr


A type can be passed to the Expression.Constant function as a second argument. Something like typeof(int?) or, in the case of this question, column.Type.

e.g.

Expression.Constant(value, column.Type) 
like image 37
Leonel B. Avatar answered Oct 05 '22 17:10

Leonel B.