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

时间:2010-10-06 11:34:14

标签: c# entity-framework linq lambda expression-trees

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

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

以下是我如何使用它:

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

这是我在将可用于可空表列时使用的异常:

  

没有为类型'System.Nullable`1 [System.Int32]'和'System.Int32'

定义二元运算符GreaterThanOrEqual

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

3 个答案:

答案 0 :(得分:47)

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

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

答案 1 :(得分:0)

一个类型可以作为第二个参数传递给 Expression.Constant 函数。类似于 typeof(int?) 或者,在这个问题的情况下,column.Type。

例如 Expression.Constant(value, column.Type)

答案 2 :(得分:-1)

您可以通过执行以下操作来检查类型是否可为空:if(typeof(T).Equals(typeof(Nullable&lt;&gt;)))我相信然后继续专门处理它。如果您可以调用GetValueOrDefault()方法不知何故,这将起作用,或者programmbly创建的比较值可能是相同的类型。

HTH。