OrderBy with SwitchExpression in Linq for Objects

I need to make a custom orderby for the listing. I am trying to use SwitchExpression:

public static IQueryable<T> MyOrderByEnum<T>(this IQueryable<T> source, string propName, Type enumType)
    {
        var type = typeof (T);
        var property = type.GetProperty(propName);
        var parameter = Expression.Parameter(type, "p");
        var propertyAccess = Expression.Property(parameter, property);

        var enumValues = Enum.GetValues(enumType);
        var switchCases = new SwitchCase[enumValues.Length];
        int i = 0;
        foreach (var val in enumValues)
        {
            switchCases[i] = Expression.SwitchCase(
                Expression.Constant(val.ToDisplay()),
                Expression.Constant(val)
                );
            i++;
        }

        var switchExpr1 =
            Expression.Switch(
                propertyAccess,
                Expression.Constant(""),
                switchCases
                );

        var orderByExp1 = Expression.Lambda(switchExpr1, parameter);
        MethodCallExpression resultExp = Expression.Call(typeof (Queryable), "OrderBy", new[] {type, orderByExp1.Body.Type}, source.Expression, orderByExp1);
        return (IOrderedQueryable<T>) source.Provider.CreateQuery(resultExp);
    }

      

But when I execute

filtered.MyOrderBy("field1", typeof(FieldState)).ToList();

      

I get an error:

Unknown LINQ expression of type "Switch".

Is there any other way to make an order expression that will translate to the "CASE WHEN ..." sql construct?

+3


source to share


1 answer


Try the expression. Condition ( https://msdn.microsoft.com/en-us/library/bb340500%28v=vs.110%29.aspx ) I think this translates to CASE When if used in anonymous projection



+1


source







All Articles