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