Динамическое упорядочение LINQ по свойству коллекции в C#C#

Место общения программистов C#
Anonymous
Динамическое упорядочение LINQ по свойству коллекции в C#

Сообщение Anonymous »

Я пытаюсь динамически упорядочить IQueryable по свойствам, и у меня есть следующая работа: я использую эту динамическую функцию порядка linq, которую я получил отсюда

Код: Выделить всё

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;
}
Это отлично работает при заказе по простым свойствам, таким как bed.type. Однако я сталкиваюсь с проблемой, когда пытаюсь упорядочить коллекцию объектов, например windows.size, где комната имеет коллекцию окон, а каждое окно имеет размер.
Вот классы, с которыми я работаю:

Код: Выделить всё

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

Вернуться в «C#»