web-dev-qa-db-ja.com

式ツリーでのNULL可能型の操作

文字列値を使用してLinqtoEntitiesの結果を動的にフィルタリングする拡張メソッドがあります。 null許容列をフィルタリングするために使用するまでは正常に機能します。これが私のコードです:

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

これをnull許容テーブル列に使用したときに発生する例外は次のとおりです。

二項演算子GreaterThanOrEqualは、タイプ 'System.Nullable`1 [System.Int32]'および 'System.Int32'に対して定義されていません。

私はこれを理解できませんでした。私は何をすべきか?

33
dstr

Expression.Convertを使用して値型を列型に変換する必要がありました。

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