Erro Consulta LINQ to Entity framework

20/10/2014

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 é:

        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

Melhor resposta

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.

Pjava

Responder Citar

Outras Respostas

20/10/2014

Pjava

Não entendi porque precisa disso: Convert.ToString(....). Isso não funciona no LINQ
Responder Citar

20/10/2014

Elber

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?
Responder Citar

20/10/2014

Elber

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?

 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();
        }
Responder Citar

20/10/2014

Elber

Obrigado, creio que é isso mesmo.
Responder Citar

20/10/2014

Elber

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();
        }
    }
Responder Citar