Код: Выделить всё
public static IOrderedQueryable OrderBy(this IQueryable source, string property)
{
return ApplyOrder(source, property, "OrderBy");
}
public static IOrderedQueryable OrderByDescending(this IQueryable source, string property)
{
return ApplyOrder(source, property, "OrderByDescending");
}
public static IOrderedQueryable ThenBy(this IOrderedQueryable source, string property)
{
return ApplyOrder(source, property, "ThenBy");
}
public static IOrderedQueryable ThenByDescending(this IOrderedQueryable source, string property)
{
return ApplyOrder(source, property, "ThenByDescending");
}
static IOrderedQueryable ApplyOrder(IQueryable source, string property, string methodName)
{
string[] props = property.Split('.');
Type type = typeof(T);
ParameterExpression arg = Expression.Parameter(type, "x");
Expression expr = arg;
foreach (string prop in props)
{
PropertyInfo pi = type.GetProperty(prop);
expr = Expression.Property(expr, pi);
type = pi.PropertyType;
}
Type delegateType = typeof(Func).MakeGenericType(typeof(T), type);
LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg);
object result = typeof(Queryable).GetMethods().Single(
method => method.Name == methodName
&& method.IsGenericMethodDefinition
&& method.GetGenericArguments().Length == 2
&& method.GetParameters().Length == 2)
.MakeGenericMethod(typeof(T), type)
.Invoke(null, new object[] { source, lambda });
return (IOrderedQueryable)result;
}
Вот классы, с которыми я работаю:
Код: Выделить всё
public class Room
{
public int Id { get; set; }
public Bed Bed { get; set; }
public ICollection Windows { get; set; }
}
public class Bed
{
public int Id { get; set; }
public string Type { get; set; }
}
public class Window
{
public int Id { get; set; }
public int Size { get; set; }
}
Код: Выделить всё
• bed.type works fine.
• windows.size does not work, as it throws an error because it tries to handle the collection directly rather than the size property of each item.
Как это изменить, чтобы правильно обрабатывать упорядочивание по свойству в коллекции, например упорядочивать комнаты по размеру окон? ?
Будем признательны за любые рекомендации!
Подробнее здесь: https://stackoverflow.com/questions/789 ... in-c-sharp