Files
Umbraco-CMS/umbraco.MacroEngines.Juno/DynamicNodeListOrdering.cs
agrath@gmail.com 3a30c285fe Updated .OrderBy implementation to support OrderBy,OrderByDescending,ThenBy,ThenByDescending properly on DynamicNodeList
Usage is: @foreach(var item in home.ChildItems.OrderBy("catCount, colour desc"))
If you use the simple form of home.ChildItems.OrderBy("catCount") it will use a simpler/faster implementation
2011-02-17 19:07:22 -13:00

56 lines
2.7 KiB
C#

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<DynamicNode, object> func, DynamicNode node)
{
var value = func(node);
while (value is Func<DynamicNode, object>)
{
value = (value as Func<DynamicNode, object>)(node);
}
return value;
}
public static IOrderedQueryable<DynamicNode> OrderBy(object source, object key)
{
IEnumerable<DynamicNode> typedSource = source as IEnumerable<DynamicNode>;
LambdaExpression lambda = key as LambdaExpression;
Func<DynamicNode, object> func = (Func<DynamicNode, object>)lambda.Compile();
IOrderedQueryable<DynamicNode> result = (IOrderedQueryable<DynamicNode>)typedSource.OrderBy(x => Reduce(func, x)).AsQueryable();
return result;
}
public static IOrderedQueryable<DynamicNode> ThenBy(object source, object key)
{
IOrderedQueryable<DynamicNode> typedSource = source as IOrderedQueryable<DynamicNode>;
LambdaExpression lambda = key as LambdaExpression;
Func<DynamicNode, object> func = (Func<DynamicNode, object>)lambda.Compile();
IOrderedQueryable<DynamicNode> result = (IOrderedQueryable<DynamicNode>)typedSource.ThenBy(x => Reduce(func, x)).AsQueryable();
return result;
}
public static IOrderedQueryable<DynamicNode> OrderByDescending(object source, object key)
{
IEnumerable<DynamicNode> typedSource = source as IEnumerable<DynamicNode>;
LambdaExpression lambda = key as LambdaExpression;
Func<DynamicNode, object> func = (Func<DynamicNode, object>)lambda.Compile();
IOrderedQueryable<DynamicNode> result = (IOrderedQueryable<DynamicNode>)typedSource.OrderByDescending(x => Reduce(func, x)).AsQueryable();
return result;
}
public static IOrderedQueryable<DynamicNode> ThenByDescending(object source, object key)
{
IOrderedQueryable<DynamicNode> typedSource = source as IOrderedQueryable<DynamicNode>;
LambdaExpression lambda = key as LambdaExpression;
Func<DynamicNode, object> func = (Func<DynamicNode, object>)lambda.Compile();
IOrderedQueryable<DynamicNode> result = (IOrderedQueryable<DynamicNode>)typedSource.ThenByDescending(x => Reduce(func, x)).AsQueryable();
return result;
}
}
}