none
EF OrderBy dinamico RRS feed

  • Pergunta

  • Estou fazendo um orderby via EF, tentando passar o parametro de ordenacao via parametro:

    public static List<Livro> ListBy(string field)
            {
                List<Livro> livros = context.Livros.OrderByDescending(m => m.GetType().GetProperty(field).GetValue(m, null).ToList();
                return livros;
            }

    No entanto, nao estou tentdo sucesso.
    Se fosse apenas um campo faria:

                List<Livro> livros = context.Livros.OrderByDescending(m => m.Livros).ToList();

    Como posso adaptar isso ? 
    Valeu

    • Movido welington jr segunda-feira, 7 de agosto de 2017 13:51 lugar mais adequadro
    domingo, 6 de agosto de 2017 04:06

Todas as Respostas

  • Voce pode fazer assim:

    1- Adicione este assembly (System.Linq.Dynamic) com o nuget ao seu projeto

    2- use string ao inves de notaçao funcional:

       List<Livro> livros = context.Livros.OrderBy("Livros DESC").ToList();

    Note que assim voce pode criar uma string valida com os campos e direçao:

    string ordem = "Autor ASC, Data DESC, Livro DESC"
    List<Livro> livros = context.Livros.OrderBy(ordem).ToList();

    Aqui um exemplo completo:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Linq.Dynamic;//!!! IMPORTANTE ADICIONAR
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication2
    {
        class Livro
        {
            public Livro(string autor, string ISBN, string titulo, DateTime data)
            {
                this.autor = autor;
                this.ISBN = ISBN;
                this.titulo = titulo;
                this.data = data;
            }
            public string autor { get; set; }
            public string ISBN { get; set; }
            public string titulo { get; set; }
            public DateTime data { get; set; }
        }
        class Program
        {
            static void Main(string[] args)
            {
                List<Livro> livros = new List<Livro>() { new Livro("William", "ABC123", "A arte do erro", new DateTime(2020, 11, 05)), new Livro("Pedro", "FEF123", "A erro da arte", new DateTime(2017, 01, 07)), new Livro("Maria", "GTR123", "A erro do erro ", new DateTime(2050, 12, 24)) };
                string ordem1 = "autor asc";
                List<Livro> livrosordenados1 = livros.OrderBy(ordem1).ToList();
                string ordem2 = "data desc, titulo asc";
                List<Livro> livrosordenados2 = livros.OrderBy(ordem2).ToList();
                Console.WriteLine("Ordem1");
                foreach (Livro l in livrosordenados1)
                    Console.WriteLine("{0} - {1}, {2}, {3}", l.autor, l.titulo, l.ISBN, l.data.ToShortDateString());
                Console.WriteLine("Ordem2");
                foreach (Livro l in livrosordenados2)
                    Console.WriteLine("{0} - {1}, {2}, {3}", l.autor, l.titulo, l.ISBN, l.data.ToShortDateString());
                Console.ReadKey();
            }
        }
    }
    

    att


    William John Adam Trindade
    Analyste-programmeur


    Sogi Informatique ltée
    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    quarta-feira, 9 de agosto de 2017 13:52