Boa tarde
Por favor estou precisando de uma ajuda para criar uma função dinâmica que ordene para mim qualquer List que eu passe como parâmetro, por qualquer propriedade que existir dentro deste List que também quero passar por parâmetro.
E quando digo qualquer propriedade me refiro a uma propriedade em si do List ou "sub-propriedades" dentro deste List. Ex.:
meuList.client_companyName
(ordenação por uma propriedade do meu List)
meuList.client_user.userName (ordenação
por uma propriedade de uma propriedade do tipo Objeto User do meu List... relação 1 x 1)
meuList.tClientAddresses[0].address_city (ordenação por uma propriedade de uma propriedade do tipo Coleção Address do meu List... relação 1 X N)
Tenho a seguinte função que funciona apenas para os 2 primeiros casos. O caso N x N, ela não consegue encontrar a propriedade address_city.
static
IOrderedQueryable<T>
ApplyOrder<T>(IQueryable<T>
source, string
property, string
methodName)
{
string[]
props = property.Split('.');
Type
type = typeof(T);
ParameterExpression
arg = Expression.Parameter(type,
"p");
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<T>)result;
}
Alguém pode me ajudar?