none
Linq to Sql OrderBy dinâmico RRS feed

  • Pergunta

  • 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?

     

    quinta-feira, 20 de janeiro de 2011 16:53

Todas as Respostas