Erro Consulta LINQ to Entity framework
Estou tentando fazer uma consulta complexa. Para fins de entendimento, vou colocar ela de forma resumida. O erro que aparece é:
An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll
Additional information: LINQ to Entities does not recognize the method 'System.String ToString(System.Object)' method, and this method cannot be translated into a store expression.
O código é:
An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll
Additional information: LINQ to Entities does not recognize the method 'System.String ToString(System.Object)' method, and this method cannot be translated into a store expression.
O código é:
private void barBtnFiltrar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { PesquisaBETAEntities pb = new PesquisaBETAEntities(); var dados = (from t0 in (from v1 in pb.view_ok where Convert.ToString(v1.resu8).Contains("") && Convert.ToString(v1.resu9).Contains("") && Convert.ToString(v1.resu10).Contains("") && Convert.ToString(v1.resu11).Contains("") && Convert.ToString(v1.sexo).Contains("") group v1 by new { v1.prof_nome, v1.resu1 } into g select new { g.Key.prof_nome, g.Key.resu1, perguntas = g.Count(p => p.resu1 != null) }) where t0.prof_nome.Contains("Elber Rizziolli Domingos") orderby t0.resu1 select new { Professor = t0.prof_nome, resultado = Convert.ToString(t0.resu1) == "60" ? "Regular" : Convert.ToString(t0.resu1) == "80" ? "Bom" : Convert.ToString(t0.resu1) == "90" ? "Ótimo" : Convert.ToString(t0.resu1) == "100" ? "Excelente" : null, p1 = (int?)t0.perguntas, }); gridControl1.DataSource = dados.ToList(); gridControl1.Refresh(); }
Elber Domingos
Curtidas 0
Melhor post
Pjava
22/10/2014
O que foi dito é que o Convert.ToString() não funciona dentro do LINQ e não o Contains. Mas fico feliz por você ter encontrado a solução e mais importante. Postou-a aqui. Isso é bem legal. Sucesso.
GOSTEI 1
Mais Respostas
Pjava
20/10/2014
Não entendi porque precisa disso: Convert.ToString(....). Isso não funciona no LINQ
GOSTEI 0
Elber Domingos
20/10/2014
Fiz isso porque a entrada de dados é integer mas preciso mostrar uma string. Portanto preciso de um aliás. Isso funcionou no LINQPad e não reclamou no visual studio, mas como faço isso sem usar a conversão?
GOSTEI 0
Elber Domingos
20/10/2014
Eu tirei o Convert.Tostring e funcionou. Mas eu preciso filtrar de forma dinamica e aceitar receber valor nulo. Quando uso o .Contains, ele aceita nulo, e pesquisa tudo quando vem valor nulo, mas só faz isso com string.
Como faço pra aceitar em inteiro ou ainda transformar o inteiro em string para aceitar o Contains?
Como faço pra aceitar em inteiro ou ainda transformar o inteiro em string para aceitar o Contains?
PesquisaBETAEntities pb = new PesquisaBETAEntities(); var dados = (from t0 in (from v1 in pb.view_ok /* where Convert.ToString(v1.resu8).Contains("") && Convert.ToString(v1.resu9).Contains("") && Convert.ToString(v1.resu10).Contains("") && Convert.ToString(v1.resu11).Contains("") && Convert.ToString(v1.sexo).Contains("") */ group v1 by new { v1.prof_nome, v1.resu1 } into g select new { g.Key.prof_nome, g.Key.resu1, perguntas = g.Count(p => p.resu1 != null) }) where t0.prof_nome.Contains("Elber Rizziolli Domingos") orderby t0.resu1 select new { Professor = t0.prof_nome, /* resultado = Convert.ToString(t0.resu1) == "60" ? "Regular" : Convert.ToString(t0.resu1) == "80" ? "Bom" : Convert.ToString(t0.resu1) == "90" ? "Ótimo" : Convert.ToString(t0.resu1) == "100" ? "Excelente" : null, */ p1 = (int?)t0.perguntas, }); gridControl1.DataSource = dados.ToList(); gridControl1.Refresh(); }
GOSTEI 0
Pjava
20/10/2014
Cara, penso assim. Se Resu8 e Resu9 são inteiros, nunca virá um vazio. Virá sempre um null ou 0 ou -1, qualquer coisa que lembre um número, mas não um vazio ou "". Isso é uma etapa. Tente fazer essa comparação fora do linq, tipo:
Não testei isso, mas veja se não dá erro.
foreach(var r in dados) { if(Convert.ToString(r.resu8).Contains("")) dados = dados.Where(w => w.aqui faz suas coisas) }
Não testei isso, mas veja se não dá erro.
GOSTEI 0
Elber Domingos
20/10/2014
Obrigado, creio que é isso mesmo.
GOSTEI 0
Elber Domingos
20/10/2014
Apenas a título de informação, consegui o que precisava. Tem como pesquisar o Contains direto pelo LINQ sem precisar usar o where fora. Aqui está o código:
private void barBtnFiltrar_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { PesquisaBETAEntities pb = new PesquisaBETAEntities(); var dados = (from t0 in (from v1 in pb.view_ok where SqlFunctions.StringConvert((decimal)v1.resu8).Contains("") && SqlFunctions.StringConvert((decimal)v1.resu9).Contains("") && SqlFunctions.StringConvert((decimal)v1.resu10).Contains("") && SqlFunctions.StringConvert((decimal)v1.resu11).Contains("") && SqlFunctions.StringConvert((decimal)v1.sexo).Contains("") group v1 by new { v1.prof_nome, v1.resu1 } into g select new { g.Key.prof_nome, g.Key.resu1, perguntas = g.Count(p => p.resu1 != null) }) where t0.prof_nome.Contains("Elber Rizziolli Domingos") orderby t0.resu1 select new { Professor = t0.prof_nome, resultado = t0.resu1 == 60 ? "Regular" : t0.resu1 == 80 ? "Bom" : t0.resu1 == 90 ? "Ótimo" : t0.resu1 == 100 ? "Excelente" : null, p1 = (int?)t0.perguntas, }); gridControl1.DataSource = dados.ToList(); gridControl1.Refresh(); } }
GOSTEI 0