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(); 😧
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
Postar um comentário