Pular para o conteúdo principal

Linq para exibição de consultas ao banco de dados.

A pouco tive uma grande dificuldade em solucionar uma mensagem que o controller apresentada ao acionar uma action que seria responsável por buscar detalhes de um produto através do JSonResult. A mensagem de exceção apresentada pelo Visual Studio 2017 era:




The entity or complex type "asses que estava trabalhando>" cannot be constructed in a LINQ to Entities query



O problema foi solucionado a partir do momento que entendi que estava realizando uma consulta no Linq que retornava um objeto do tipo IQueryable e que precisava de uma List<>. Isso foi facilmente resolvido com o procedimento existente .ToList()



Até tudo bem! Uma aparente orelhada. 



Mas ainda sim a mensagem acima não deixava de ser exibida em tempo de execução. 😒 Muitas pesquisas realizadas e descobri que após a seleção dos arquivos eu deveria converter o resultado para uma IEnumerable, atribuir os dados à uma classe com o procedimento Select(lambda expression), utilizar o procedimento Where para filtrar os dados e depois converter isso tudo para uma lista com o .ToList(); 😧


Exemplo de código:  

ListProductsAndPart = (from product in db.tb_ato_products_and_parts
                       join manufacturers in db.tb_ato_manufacturers
                         on product.ama_code equals manufacturers.ama_code
                       into productsAndParts
                         from productAndPartsWithManufactures in productsAndParts.DefaultIfEmpty()
                       group productAndPartsWithManufactures by new
                       {
                         product.pap_code,
                         productAndPartsWithManufactures.ama_name,
                         product.pap_legacy,
                         product.pap_name,
                         product.pap_description,
                         product.pap_unit_of_measurement,
                         product.pap_legacy_manufacturers,
                         product.pap_is_part,
                         product.pap_display
                       } into productsAndPartsGrouped
                       select new
                       {
                         pap_code = productsAndPartsGrouped.Key.pap_code,
                         ama_name = productsAndPartsGrouped.Key.ama_name == null ? "(Sem Fabricante)" : productsAndPartsGrouped.Key.ama_name,
                         pap_legacy = productsAndPartsGrouped.Key.pap_legacy,
                         pap_name = productsAndPartsGrouped.Key.pap_name,
                         pap_description = productsAndPartsGrouped.Key.pap_description,
                         pap_unit_of_measurement = productsAndPartsGrouped.Key.pap_unit_of_measurement,
                         pap_legacy_manufacturers = productsAndPartsGrouped.Key.pap_legacy_manufacturers,
                         pap_is_part = productsAndPartsGrouped.Key.pap_is_part,
                         pap_display = productsAndPartsGrouped.Key.pap_display
                       }).AsEnumerable().Select(p => new tb_ato_products_and_parts()
                       {
                         pap_code = p.pap_code,
                         Manufacturers = new tb_ato_manufacturers() {
                           ama_name = p.ama_name
                         },                                   
                         pap_legacy = p.pap_legacy,
                         pap_name = p.pap_name,
                         pap_description = p.pap_description,
                         pap_unit_of_measurement = p.pap_unit_of_measurement,
                         pap_legacy_manufacturers = p.pap_legacy_manufacturers,
                         pap_is_part = p.pap_is_part,
                         pap_display = p.pap_display
                       }).Where(p => p.pap_legacy == intCodeProductAndParts).ToList();


O código acima é funcional e não retorna erro quando atribuído a variável ListProductsAndPart que foi instanciada com o tipo Object. Uma das correções realizadas no código foram:
  • Inclusão do procedimento .DefaultIfEmpty() após o primeiro from para que permitisse que os registros que não tinham relação através das chaves das Entities relacionadas;
  • Inclusão da expressão (Sem Fabricante);
  • Inclusão do Procedimento .AsEnumerable() que realizava a conversão do tipo IQueryable para IEnumerable isso porque permitiria a conversão para .ToList();
  • Utilização do procedimento Select utilizando uma expressão lambda instanciando a classe e atribuindo valores as propriedades. 



No meu caso Where estava sendo posicionada corretamente e o procedimento .ToList() também.

Caso tenha alguma dúvida por favor me escreva: gestordesistemas@gmail.com





Comentários

Postagens mais visitadas deste blog

Mercado Brasileiro em 17 de janeiro de 2025

Ações que Mais Subiram CSN Mineração foi a campeã do dia, com o preço das ações subindo mais de 5%. IRB Brasil e SID Nacional também se deram bem, com aumentos de mais de 4% cada uma. Outras empresas, como Minerva , Usiminas , e Vale , também tiveram um bom dia, com preços subindo. Ações que Mais Caíram YDUQS teve a maior queda, com os preços caindo mais de 5%. Hapvida e Cosan também não se saíram bem, com quedas de quase 5%. Mercado em Geral Agrogalaxy foi a estrela do dia, com um aumento incrível de mais de 63% no preço das ações. Comgás e outra empresa chamada PMCO 1T5 também tiveram ótimos resultados, com aumentos de cerca de 30%. Algumas empresas, como FII Tour VCI e Dasa BNS , não tiveram um bom dia, com quedas grandes nos preços. Ações Mais Negociadas Vale foi a ação mais comprada e vendida do dia, movimentando muito dinheiro. Petrobras e iShares BOVA também foram bastante negociadas. Opções As pessoas estavam comprando muitas opções de c...

Uma Geladeira a suas Preocupações

 As principais dores de cabeça quando se busca uma geladeira para o seu negócio no ramo de alimentos geralmente são:  Se livrar de microrganismos e outros riscos de contaminação; O preço do eletrodoméstico; A capacidade de armazenamento; O consumo de energia; O espaço disponível para a instalação da geladeira; Tipo de piso para suportar o peso do eletrodoméstico; Resistência para suportar o desgaste diário; Isolamento das portas para evitar a contaminação e o desperdício de eletricidade; Evitar a contaminação cruzada de alimentos; Nível adequado de precisão de temperatura; Facilidade de limpar e manter limpos os filtros de refrigeração (quando houver); Lidar em tempo com sujeira e odores desagradáveis; A sensação de quem fez uma boa escolha ao comprar uma geladeira observando estes princípios é de satisfação e alívio. Saber que os alimentos estarão armazenados em condições seguras, prontos para servi-los com segurança aos clientes é muito importante sem contar que pode-se evit...

Incluir nos processos organizacionais a atuação na internet é algo que compensa?

Durante a apresentação dos serviços de internet a empresários dos ramos de papelaria nos estados de Espírito Santo, Rio de Janeiro, São Paulo percebemos que existem dúvidas comuns. Em uma abordagem simples sem muitas explicações a maioria se apega aos custos e acabam limitando sua atuação ao balcão. Existem diversas ferramentas que são capazes de auxiliar na divulgação dos serviços e produtos através da internet. E ainda somente ter um bom site profissional com uma hospedagem de qualidade não é suficiente. Vale também anunciar em outros sites de maior visitação seus produtos e serviços. Porém existem cuidados que se deve tomar quanto a escolha. "O primeiro item a ser verificado é a relevância que esse site tem no mercado e no seu público alvo, você pode fazer uma pesquisa bem simples até informal perguntado para seus amigos, colaboradores, proprietários de lan-houses e cybers-café se o site que você tem interesse de anunciar é conhecido ou acessado. Outro item muito importante a...