none
Linq Visual Studio 2008 - Where com conversão de tipos RRS feed

  • Pergunta

  • Estou com a seguinte dificuldade no linq:

    Já aviso que este um sistema legado sem documentação que estou tentando dar manutenção, por tanto existem um série barbarismo na modelagem e implementação de se assustar. Porém não tenho temo de refazer então tenho de conviver com os problemas.

    Tenho um tabela com um campo TAG-STATUS do tipo CHAR. 

    Onde é gravado valores: 0, 1 , 2 .. A,B,C e por ai vai.

    Preciso fazer uma um consulta com um where assim:

            var recebimento = (from r in DB.TRECEBIMENTO                            where r.TAG_STATUS_DOCUMENTO < '5'                           select new                           {                               codigo = r.NUM_ID_RECEBIMENTO,                               usuarioRealizador = r.NUM_ID_USUARIO_REALIZADOR,                               usuarioConferente = r.NUM_ID_USUARIO_CONFERENTE,                               nomeUsuarioConferente = (from u in DB.TUSUARIO where u.NUM_ID_USUARIO == r.NUM_ID_USUARIO_CONFERENTE select u.DES_LOGIN).FirstOrDefault(),            dataConferencia = r.DAT_CONFERENCIA_FIM                           });



    Ou assim:

    recebimento = recebimento.Where(v => v.IdStatusDocumento.< '7');



    Teria como converter o TAG_STATUS_DOCUMENTO de char para int32 no uso do where?

    O interessante que usando o LinqPad, software que executar as expressões em linq a expressão:

    from r in TRECEBIMENTO	where  r.TAG_STATUS_DOCUMENTO < '5'	select new	{	codigo = r.NUM_ID_RECEBIMENTO,



    Funciona sem problemas!

    Lembrando é linq pro .net 3.5!!

    Se esta não for área correta peço a fineza de mover para área correta.

     


    Ninguém falou que seria fácil!

    quarta-feira, 27 de fevereiro de 2013 19:38

Respostas

  • Junior,

    Agradeço imensamente a atenção.

    Ok. Com relação a converter no retorno do linq já tinha aprendido apanhando. 

    O que faz sentido pois na apresentação pode-se usar o format e etc.

    A questão toda é com relação ao where.

    Pelo que entendi, e olha sou meio lento, não teria como efetuar o seguinte where:

    from r in DB.TRECEBIMENTO
             where r.TAG_STATUS_DOCUMENTO < 5

    O problema é que o campo TAG_STATUS_DOCUMENTO é char.

    E preciso efetuar uma comparação menor que com um número.

    Queria algo assim:

    from r in DB.TRECEBIMENTO
             where <int32>r.TAG_STATUS_DOCUMENTO < 5

    Ou assim:

    recebimento = recebimento.Where(v => <int32> v.IdStatusDocumento < 5

    Alguma ideia de como contornar a situação?


    Ninguém falou que seria fácil!

    • Marcado como Resposta jothaz sexta-feira, 28 de novembro de 2014 22:44
    quarta-feira, 27 de fevereiro de 2013 20:09

Todas as Respostas

  • Em linq não tem como vc fazer um convert como fazia no sql normal tipo select convert(varchar(10),data,103) isso faz com que a data venha no formato dd/mm/aaaa. Em linq vc trata isso qdo pega a informação e a exibe para esse exemplo ele trás a data toda ou seja dd/mm/aaaa hh:mm:ss entao eu faço assim

    txtdata.text = recebimento.data.substring(0,10);

    deu para entender ?


    Junior

    quarta-feira, 27 de fevereiro de 2013 19:48
  • Junior,

    Agradeço imensamente a atenção.

    Ok. Com relação a converter no retorno do linq já tinha aprendido apanhando. 

    O que faz sentido pois na apresentação pode-se usar o format e etc.

    A questão toda é com relação ao where.

    Pelo que entendi, e olha sou meio lento, não teria como efetuar o seguinte where:

    from r in DB.TRECEBIMENTO
             where r.TAG_STATUS_DOCUMENTO < 5

    O problema é que o campo TAG_STATUS_DOCUMENTO é char.

    E preciso efetuar uma comparação menor que com um número.

    Queria algo assim:

    from r in DB.TRECEBIMENTO
             where <int32>r.TAG_STATUS_DOCUMENTO < 5

    Ou assim:

    recebimento = recebimento.Where(v => <int32> v.IdStatusDocumento < 5

    Alguma ideia de como contornar a situação?


    Ninguém falou que seria fácil!

    • Marcado como Resposta jothaz sexta-feira, 28 de novembro de 2014 22:44
    quarta-feira, 27 de fevereiro de 2013 20:09
  • Bom depois de muito pesquisa, não achei muita referência ao Linq para o 3.5, consegui contornar a situação assim:

    Faço o select e depois aplico o where no resultado do select.

    var recebimento = (from r in DB......

      recebimento = recebimento.Where(v => v.IdStatusDocumento.Equals("0") || v.IdStatusDocumento.Equals("1") .....

    É até vergonhoso publicar um gato, ou gambi, destes, mas pelo menos tentei. kkk

    Se alguém com maiores conhecimentos possuir conhecimento de algo mais elegante e simples, fico no aguardo.

    Esta funcionando e não perda de performance, agora se é a melhor solução, só quem fala esta linguagem de Asmodeus, chama Linq! kkk


              



    Ninguém falou que seria fácil!

    • Sugerido como Resposta Softlesk quinta-feira, 11 de abril de 2013 13:30
    quarta-feira, 27 de fevereiro de 2013 23:47
  • Se funcionou é o que importa. Amanhã ou depois vc aprende um jeito mais "elegante"!!!

    Leandro

    quinta-feira, 11 de abril de 2013 13:30
  • vc já verificou se é gerado algum problema ao atualizar somente a dll System.Linq e System.Xml ?

    a ultilização dessa forma não resulta em erro 

    var objeto  = colecao.FirstOrDefault(o=>  5 >  (int)o.PropriedadeChar);

    quinta-feira, 18 de abril de 2013 03:59