none
LINQ to Entities OrderBy por tabela filha RRS feed

  • Pergunta

  • Oi pessol, tudo bem?

    Estou com um pequeno problema pra ordernar os resultados de uma consulta utilizando lambda expression com LINQ to Entities.

    Basicamente preciso retornar os resultados de uma tabela chamada Pessoas que possue um Estado relacionado. No meu relatório preciso ordernar o resultado pelo nome do Estado, mas com o código que to usando esta gerando um erro de aspnet, segue o código:

    contextoDados = new CadastroEntities();
    
    listaPessoas.DataSource = contextoDados.Pessoas.Where(c => c.Excluido == false).OrderByDescending(c => c.Estado.Nome);

    Desta forma, recebo o erro: "Não há suporte ao membro 'PessoasReference' do tipo especificado em LINQ to Entities. Somente inicializadores, membros de entidade e propriedades de navegação de entidade têm suporte.".

    Qual a forma correta para fazer esta ordenação? 

    Obrigado por enquanto! :)

    terça-feira, 14 de fevereiro de 2012 20:58

Respostas

  • Olá castrors,

    Fiz alguns testes e encontrei uma implementação que te atende, só não tenho certeza se esta é a melhor solução.

    Para isso, primeiramente é necessário realizar um relacionamento ((join) entre a tabela pai e filha. Feito isso, cria-se uma projeção com os registros da tabela pai e a coluna da tabela filha a ser utilizada para ordenar os registros. Por fim, restringe-se este resultado até então obtido, gerando uma nova consulta somente com os registros da tabela pai.

    O código abaixo foi implementando utilizando as tabelas "Orders" e "Orders_Details" da database "Northwind".

                using (var db = new NorthwindEntities())
                {
                    var orders = db.Orders
                        .Join(db.Order_Details, o => o.OrderID, od => od.OrderID,
                                                (o, od) => new
                                                {
                                                    Orders = o,
                                                    OrderDetailsQuantity = od.Quantity
                                                })
                        .OrderByDescending(sort => sort.OrderDetailsQuantity)
                        .AsEnumerable()
                        .Select(x => x.Orders);
                }

    Abraços!


    Blog: www.jeduardocastro.com.br
    Twitter: @jeducc

    quarta-feira, 15 de fevereiro de 2012 01:41

Todas as Respostas

  • Olá castrors,

    Fiz alguns testes e encontrei uma implementação que te atende, só não tenho certeza se esta é a melhor solução.

    Para isso, primeiramente é necessário realizar um relacionamento ((join) entre a tabela pai e filha. Feito isso, cria-se uma projeção com os registros da tabela pai e a coluna da tabela filha a ser utilizada para ordenar os registros. Por fim, restringe-se este resultado até então obtido, gerando uma nova consulta somente com os registros da tabela pai.

    O código abaixo foi implementando utilizando as tabelas "Orders" e "Orders_Details" da database "Northwind".

                using (var db = new NorthwindEntities())
                {
                    var orders = db.Orders
                        .Join(db.Order_Details, o => o.OrderID, od => od.OrderID,
                                                (o, od) => new
                                                {
                                                    Orders = o,
                                                    OrderDetailsQuantity = od.Quantity
                                                })
                        .OrderByDescending(sort => sort.OrderDetailsQuantity)
                        .AsEnumerable()
                        .Select(x => x.Orders);
                }

    Abraços!


    Blog: www.jeduardocastro.com.br
    Twitter: @jeducc

    quarta-feira, 15 de fevereiro de 2012 01:41
  • Oi José Eduardo, desculpe pelo retorno. Sua resposta deu certo, consegui implementar!

    Tive apenas que fazer algumas adaptações, desta forma não consigo utilizar num ListView, pois a fonte de dados não implementa uma ICollection, a solução foi criar uma Class usando Collections Generic, daí obtive 100% de sucesso.

    O link da solução do IColletion é este: http://www.codeproject.com/Articles/24065/Paging-ListView-With-DataPager

    Obrigado José, abraço!

    quinta-feira, 16 de fevereiro de 2012 20:36