在表达式树中使用可空类型

我有一个扩展方法,使用字符串值动态过滤Linq到实体结果。 它工作正常,直到我用它来过滤可空列。 这是我的代码:

public static IOrderedQueryable OrderingHelperWhere(this IQueryable 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)source.Provider.CreateQuery(methodCall); } 

这是我如何使用它:

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

当我将它用于可为空的表列时,这是我得到的exception:

没有为类型’System.Nullable`1 [System.Int32]’和’System.Int32’定义二元运算符GreaterThanOrEqual

我无法理解这一点。 我该怎么办?

我必须使用Expression.Convert将值类型转换为列类型:

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

您可以通过执行以下操作来检查类型是否可为空:if(typeof(T).Equals(typeof(Nullable <>))我相信然后继续专门处理它。如果您可以以某种方式调用GetValueOrDefault()方法,那么work或programmbly创建比较值可能是相同类型。

HTH。