Mam metodę rozszerzenia do dynamicznego filtrowania wyników Linq do Entities przy użyciu wartości ciągu. Działa dobrze, dopóki nie użyję go do filtrowania zerowych kolumn. Oto mój kod:Praca z typami zerującymi w drzewach wyrażeń
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);
}
Oto jak go używać:
var results = (from row in ctx.MyTable select row)
.OrderingHelperWhere("userId", 5);//userId is nullable column
Oto wyjątek Dostaję kiedy używam tego dla pustych kolumn tabeli:
Operator binarny GreaterThanOrEqual nie jest zdefiniowany dla typów "System.Nullable" 1 [System.Int32] "i" System.Int32 "
Nie mogłem tego rozgryźć. Co powinienem zrobić?
możliwy duplikat [Expression.GreaterThan kończy się niepowodzeniem, jeśli perand jest typu zerowego, inne nie są zerowalne] (http://stackoverflow.com/questions/2088231/expression-greaterthan-fails-if-one-operand-is-nullable-type-other-is-non-nulla) – nawfal