none
Erro no meu select com linq RRS feed

  • Pergunta

  • Tenho um select que funciona perfeitamente no T-SQL

    Mudei ele pra linq pra ser usado no linq do C# com as suas adaptações

    Porem esta dando o erro abaixo no meu ultimo select

    Error 13 Cannot implicitly convert type 'System.Linq.IQueryable<AnonymousType#1>' to 'System.Linq.IQueryable<Model.CLIENTES>'. An explicit conversion exists (are you missing a cast?) C:\ARTSIM\SchoolSystem\SchoolSystem\Mailing.aspx.cs 219 38 SchoolSystem

    sourceClientes = from C in mdc.CLIENTES
                                         join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO }
                                         equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) }
                                         where
                                           CT.EMAIL != "" &&

                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "R" &&
                                                H.REVISTA == "002"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null &&

                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "C" &&
                                                H.CATEGORIA == "CON"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null
                                         orderby CT.EMAIL
                                         select new
                                         {
                                             CODIGO = (int?)C.CODIGO,
                                             C.RAZAO,
                                             CT.EMAIL
                                         };

    segunda-feira, 3 de agosto de 2015 23:13

Respostas

  • Entendi,

     bom e as outras propriedades além de código e razão não será preenchida ? Se for seria assim:

    sourceClientes = (from C in mdc.CLIENTES
                                         join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO }
                                         equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) }
                                         where
                                           CT.EMAIL != "" &&
    
                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "R" &&
                                                H.REVISTA == "002"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null &&
    
                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "C" &&
                                                H.CATEGORIA == "CON"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null
                                         orderby CT.EMAIL
                                         select new 
                                         {
                                             CODIGO = (int)C.CODIGO,
                                             C.RAZAO,
                                             CT.EMAIL
                                         }).ToList()
                                           .Select(i => new Clientes
    {
     CODIGO = (int)i.CODIGO,
     RAZAO =   i.RAZAO                  
    
    }).ToList();

    • Marcado como Resposta Marcos SJ quinta-feira, 6 de agosto de 2015 20:00
    quinta-feira, 6 de agosto de 2015 16:48

Todas as Respostas

  • Não é só converter... 

    tem que entender o que ele retorna e ir fazendo a query aos poucos, algumas condições tem uns jeitos bizarros de fazer mas na web tem, e se souber o que procura vai achar e conseguir colocar no código. 

    mas tem que ir fazendo aos poucos e verificando se é certo no linq. realmente não é só "converter"


    Desenvolvedor de sistemas VB6, ASP, ASP.NET, C#, VB.NET, SQL Server, Oracle e MySql.

    terça-feira, 4 de agosto de 2015 06:37
  • Bom dia Eric

    Eu analisei o código inteiro antes de postar.

    Fiz como você colocou pedaço por pedaço

    E a parte que esta com erro e nesse select

     select new
                                         {
                                             CODIGO = (int?)C.CODIGO,
                                             C.RAZAO,
                                             CT.EMAIL
                                         };

    Não entendi o motivo.

    Você pode me ajudar por favor.

    Obrigado.

    terça-feira, 4 de agosto de 2015 09:00
  • Olá, 

     esse erro é que sua variavel "sourceClientes" espera um tipo Clientes não um tipo anonimo, ficaria algo desse tipo :

     select new CLIENTES
                      {
                         CODIGO = (int?)C.CODIGO,
                         C.RAZAO,
                         CT.EMAIL
                       }).ToList();
     faça a alteração para retornar o tipo Clientes que vai funcionar.

    terça-feira, 4 de agosto de 2015 12:32
  • Remove ? e teste novamente, quando digita C. o campo código aparece no intelisense?

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    • Sugerido como Resposta Marcos SJ terça-feira, 4 de agosto de 2015 20:07
    terça-feira, 4 de agosto de 2015 12:52
  • Muito Obrigado pela ajuda pessoal

    Mas continua ainda com um erro no código.

    Desculpa por não conseguir resolver mas estou começando a estudar o código ASP.NET C#.

    Error 1 Invalid expression term ')' C:\ARTSIM\SchoolSystem\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem
    Error 2 ; expected C:\ARTSIM\SchoolSystem\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem

                                         select new CLIENTES
                                          {
                                             CODIGO = (int?)C.CODIGO,
                                             C.RAZAO,
                                             CT.EMAIL
                                           }).ToList();

    Agora o erro só ficou no ).ToList();

    Se alguem puder me ajudar eu agradeço muito.

    Obrigado.


    terça-feira, 4 de agosto de 2015 20:17
  • Olá,

     supondo que o resto da query esteja correta veja :

    sourceClientes = (from C in mdc.CLIENTES
                                         join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO }
                                         equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) }
                                         where
                                           CT.EMAIL != "" &&
    
                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "R" &&
                                                H.REVISTA == "002"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null &&
    
                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "C" &&
                                                H.CATEGORIA == "CON"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null
                                         orderby CT.EMAIL
                                         select new Clientes
                                         {
                                             CODIGO = (int)C.CODIGO,
                                             C.RAZAO,
                                             CT.EMAIL
                                         }).ToList();


    quarta-feira, 5 de agosto de 2015 10:34
  • Boa Tarde Daniel Brito

    Nossa eu ja estou até sonhando em resolver essa query. A esperança é a ultima que morre.

    Vamos la.

    Coloquei do jeito que você postou porem continua com erro

    {

    CODIGO = (int)C.CODIGO,

    C.RAZAO,

    CT.EMAIL

    }).ToList();

    Error 4 'SchoolSystem.Clientes' does not contain a definition for 'CODIGO' C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 221 43 SchoolSystem

    Error 5 Invalid initializer member declarator C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 222 43 SchoolSystem

    Error 6 Invalid initializer member declarator C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 223 43 SchoolSystem

    quarta-feira, 5 de agosto de 2015 17:10
  • selectnew

    {

    CODIGO = (int)C.CODIGO,

    RAZAO = C.RAZAO,

    EMAIL = CT.EMAIL

    }).ToList();

    Eu tentei dessa forma e mudou o erro. Acho que esta quase la.

    Error 4 Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Linq.IQueryable<Model.CLIENTES>'. An explicit conversion exists (are you missing a cast?) C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem


    quarta-feira, 5 de agosto de 2015 17:16
  • select new

    {

    CODIGO = (int)C.CODIGO,

    RAZAO = C.RAZAO,

    EMAIL = CT.EMAIL

    }).ToList();

    Eu tentei dessa forma e mudou o erro. Acho que esta quase la.

    Error 4 Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Linq.IQueryable<Model.CLIENTES>'. An explicit conversion exists (are you missing a cast?) C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem

    quinta-feira, 6 de agosto de 2015 12:01
  • select new

    {

    CODIGO = (int)C.CODIGO,

    RAZAO = C.RAZAO,

    EMAIL = CT.EMAIL

    }).ToList();

    Eu tentei dessa forma e mudou o erro. Acho que esta quase la.

    Error 4 Cannot implicitly convert type 'System.Collections.Generic.List<AnonymousType#1>' to 'System.Linq.IQueryable<Model.CLIENTES>'. An explicit conversion exists (are you missing a cast?) C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 224 41 SchoolSystem

    Olá, 

     o exemplo que lhe passei funciona, mas tudo depende do tipo de retorno que você deseja, pelo que vejo sua variavel "sourceClientes" espera um objeto do tipo CLIENTES, quando faz apenas "Select New " você tenta atribuir um tipo anonimo a um tipo cliente que resulta em erro tempo de compilação, creio que deve verificar 1 o que deseja retornar para fazer funcionar.

    quinta-feira, 6 de agosto de 2015 12:35
  • Bom dia Daniel

    Eu tentei dessa forma. colocando o cliente conforme o código a baixo e esta dando erro.

    Quando tiver um tempinho e puder me ajudar eu agraço.

    Obrigado

    if(DropDownListCategorias.Text != "")

    {

    sourceClientes = (fromC inmdc.CLIENTES

    joinCT inmdc.CONTATOS onnew{ CLIENTE = C.CODIGO }

    equalsnew{ CLIENTE = Convert.ToInt32(CT.CLIENTE) }

    where

    CT.EMAIL != ""&&

    (fromH inmdc.HISTCATREVs

    where

    H.CODIGOTIPO == C.CODIGO &&

    H.TIPO == "R"&&

    H.REVISTA == "002"

    selectnew

    {

    Column1 = 1

    }).Single() != null&&

    (fromH inmdc.HISTCATREVs

    where

    H.CODIGOTIPO == C.CODIGO &&

    H.TIPO == "C"&&

    H.CATEGORIA == "CON"

    selectnew

    {

    Column1 = 1

    }).Single() != null

    orderbyCT.EMAIL

    selectnewCLIENTES

    {

    CODIGO = (int)C.CODIGO,

    RAZAO = C.RAZAO,

    EMAIL = CT.EMAIL

    });

    }

    gwDados.DataSource = sourceClientes;

    gwDados.DataBind();

    }

    catch(Exception)

    {

    throw;

    }

    finally

    {

    mdc.Dispose();

    }

    Erro:

    Erro de Servidor no Aplicativo '/'.

    A construção explícita do tipo de entidade 'Model.CLIENTES' na consulta não é permitida.

    Descrição: Ocorreu uma exceção sem tratamento durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código.

    Detalhes da Exceção: System.NotSupportedException: A construção explícita do tipo de entidade 'Model.CLIENTES' na consulta não é permitida.

    Erro de Origem:
    Linha 233:            catch (Exception)
    Linha 234:            {
    Linha 235:                throw;
    Linha 236:            }
    Linha 237:            finally                   

    Arquivo de Origem: c:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs   Linha: 235

    Rastreamento de Pilha:
    [NotSupportedException: A construção explícita do tipo de entidade 'Model.CLIENTES' na consulta não é permitida.]
       System.Data.Linq.SqlClient.QueryConverter.VisitMemberInit(MemberInitExpression init) +869768
       System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +282
       System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector) +162
       System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc) +1982
       System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc) +69
       System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node) +1081
       System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node) +100
       System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations) +114
       System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +132
       System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +33
       System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +375
       System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
       System.Data.Linq.Provider.BindingList.Create(DataContext context, IEnumerable`1 sequence) +85
       System.Data.Linq.DataQuery`1.GetNewBindingList() +43
       System.Data.Linq.DataQuery`1.System.ComponentModel.IListSource.GetList() +19
       System.Web.UI.DataSourceHelper.GetResolvedDataSource(Object dataSource, String dataMember) +9674840
       System.Web.UI.WebControls.ReadOnlyDataSource.System.Web.UI.IDataSource.GetView(String viewName) +42
       System.Web.UI.WebControls.DataBoundControl.ConnectToDataSourceView() +130
       System.Web.UI.WebControls.DataBoundControl.GetData() +9
       System.Web.UI.WebControls.DataBoundControl.PerformSelect() +59
       System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +74
       System.Web.UI.WebControls.GridView.DataBind() +9
       SchoolSystem.Mailing.populateGrid(Int32 pIndex) in c:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs:235
       SchoolSystem.Mailing.btnSearch_Click(Object sender, EventArgs e) in c:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs:253
       System.Web.UI.WebControls.Button.OnClick(EventArgs e) +9671538
       System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +108
       System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +12
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +15
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1639
                       


    Informações sobre a Versão: Microsoft .NET Framework Versão:4.0.30319; Versão do ASP.NET:4.6.79.0

    quinta-feira, 6 de agosto de 2015 12:47
  • Entendi,

     faça na memória os dados para o tipo cliente :

    sourceClientes = (from C in mdc.CLIENTES
                                         join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO }
                                         equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) }
                                         where
                                           CT.EMAIL != "" &&
    
                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "R" &&
                                                H.REVISTA == "002"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null &&
    
                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "C" &&
                                                H.CATEGORIA == "CON"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null
                                         orderby CT.EMAIL
                                         select new 
                                         {
                                             CODIGO = (int)C.CODIGO,
                                             C.RAZAO,
                                             CT.EMAIL
                                         }).ToList()
                                           .Select(i => new Clientes
    {
     CODIGO = (int)C.CODIGO,
                                             C.RAZAO,
                                             CT.EMAIL
    
    }).ToList();
     Teste assim.

    quinta-feira, 6 de agosto de 2015 13:10
  • Daniel

    Coloquei igual como você postou.

    Agora esta dando esses erros:

    Error 13 'SchoolSystem.Clientes' does not contain a definition for 'CODIGO' C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 227 44 SchoolSystem
    Error 14 The name 'C' does not exist in the current context C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 227 58 SchoolSystem
    Error 15 Invalid initializer member declarator C:\ARTSIM\SGSIM\SchoolSystem\Mailing.aspx.cs 228 44 SchoolSystem

    Os erros estão nessas 3 linhas

    CODIGO = (int)C.CODIGO,

    C.RAZAO,

    CT.EMAIL

    quinta-feira, 6 de agosto de 2015 13:21
  • Quais são as propriedades na classe CLIENTES ?

     Existe a propriedade chamada CODIGO nessa classe ?

    quinta-feira, 6 de agosto de 2015 13:40
  • DANIEL

    CLIENTES É MINHA CLASSE DA MINHA TABELA CLIENTES

    CODIGO É UM CAMPO DA MINHA TABELA CLIENTES

    ESTOU USANDO O LINQ

    quinta-feira, 6 de agosto de 2015 13:53
  • Entendi,

     bom e as outras propriedades além de código e razão não será preenchida ? Se for seria assim:

    sourceClientes = (from C in mdc.CLIENTES
                                         join CT in mdc.CONTATOS on new { CLIENTE = C.CODIGO }
                                         equals new { CLIENTE = Convert.ToInt32(CT.CLIENTE) }
                                         where
                                           CT.EMAIL != "" &&
    
                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "R" &&
                                                H.REVISTA == "002"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null &&
    
                                             (from H in mdc.HISTCATREVs
                                              where
                                                H.CODIGOTIPO == C.CODIGO &&
                                                H.TIPO == "C" &&
                                                H.CATEGORIA == "CON"
                                              select new
                                              {
                                                  Column1 = 1
                                              }).Single() != null
                                         orderby CT.EMAIL
                                         select new 
                                         {
                                             CODIGO = (int)C.CODIGO,
                                             C.RAZAO,
                                             CT.EMAIL
                                         }).ToList()
                                           .Select(i => new Clientes
    {
     CODIGO = (int)i.CODIGO,
     RAZAO =   i.RAZAO                  
    
    }).ToList();

    • Marcado como Resposta Marcos SJ quinta-feira, 6 de agosto de 2015 20:00
    quinta-feira, 6 de agosto de 2015 16:48
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 6 de agosto de 2015 20:00