using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Linq.Expressions; namespace umbraco.MacroEngines { public static class DynamicNodeListOrdering { private static object Reduce(Func func, DynamicNode node) { var value = func(node); while (value is Func) { value = (value as Func)(node); } return value; } public static IOrderedQueryable OrderBy(object source, object key) { IEnumerable typedSource = source as IEnumerable; LambdaExpression lambda = key as LambdaExpression; Func func = (Func)lambda.Compile(); IOrderedQueryable result = (IOrderedQueryable)typedSource.OrderBy(x => Reduce(func, x)).AsQueryable(); return result; } public static IOrderedQueryable ThenBy(object source, object key) { IOrderedQueryable typedSource = source as IOrderedQueryable; LambdaExpression lambda = key as LambdaExpression; Func func = (Func)lambda.Compile(); IOrderedQueryable result = (IOrderedQueryable)typedSource.ThenBy(x => Reduce(func, x)).AsQueryable(); return result; } public static IOrderedQueryable OrderByDescending(object source, object key) { IEnumerable typedSource = source as IEnumerable; LambdaExpression lambda = key as LambdaExpression; Func func = (Func)lambda.Compile(); IOrderedQueryable result = (IOrderedQueryable)typedSource.OrderByDescending(x => Reduce(func, x)).AsQueryable(); return result; } public static IOrderedQueryable ThenByDescending(object source, object key) { IOrderedQueryable typedSource = source as IOrderedQueryable; LambdaExpression lambda = key as LambdaExpression; Func func = (Func)lambda.Compile(); IOrderedQueryable result = (IOrderedQueryable)typedSource.ThenByDescending(x => Reduce(func, x)).AsQueryable(); return result; } } }