locked
Como não duplicar meu select ? RRS feed

  • Pergunta

  • Tenho um select com 3 tabelas que esta funcionando perfeitamente no meu código C#.

    Porem o campo email esta repetindo.

    como faço para não repetir ?

    sourceClientes = fromcli inmdc.CLIENTES

    joinCT inmdc.CONTATOS oncli.CODIGO equalsCT.CLIENTE

    where

    CT.EMAIL != ""

    //CATEGORIAS

    &&

    mdc.HISTCATREVs.Any(P => P.CODIGOTIPO == cli.CODIGO &&

    P.TIPO == "C"&&

    P.CATEGORIA == DropDownListCategorias.Text)

    //REVISTAS

    &&

    mdc.HISTCATREVs.Any(P => P.CODIGOTIPO == cli.CODIGO &&

    P.TIPO == "R"&&

    P.REVISTA == DropDownListRevistas.Text)

    orderbyCT.EMAIL

    selectnew

    { cli.CODIGO, cli.RAZAO, CT.EMAIL };


    • Editado Marcos SJ sexta-feira, 4 de setembro de 2015 14:25 Edição
    sexta-feira, 4 de setembro de 2015 12:30

Respostas

  • Com o linq não é tão diferente assim. Você chegou a ler todos os links que eu te indiquei? Lá explica como funciona a interface IEqualityComparer e como você pode se utilizar dela para, entre outras coisas, filtrar coleções, que é o que você precisa.

    Você vai precisar de uma segunda coleção, que recebe o resultado do método Distinct que você vai executar na coleção que vai obter como resultado da sua query. Este resultado não irá conter resultados repetidos e você pode usar com qualquer coisa que já faria com a coleção original. Só que sem repetidos.

    Seu código vai ficar mais ou menos assim, altere de acordo com suas necessidades de negócios:

    class DistinctItemComparer : IEqualityComparer<Contato> {
    
        public bool Equals(Contato x, Contato y) {
            return x.Codigo == y.Codigo &&
                x.Razao == y.Razao &&
                x.Email == y.Email;
        }
    
        public int GetHashCode(Contato obj) {
            return obj.Codigo.GetHashCode() ^
                obj.Razao.GetHashCode() ^
                obj.Email.GetHashCode();
        }
    }


                seuMetodo (seuParametro seuparametro)
                {
                    var sourceClientes = from cli in mdc.CLIENTES
                                         join CT in mdc.CONTATOS 
                                         on cli.CODIGO equals CT.CLIENTE
                                         where CT.EMAIL != "" //CATEGORIAS
                                      && mdc.HISTCATREVs.Any( P => P.CODIGOTIPO == cli.CODIGO 
                                                           && P.TIPO == "C" 
                                                           && P.CATEGORIA == DropDownListCategorias.Text ) //REVISTAS
                                      && mdc.HISTCATREVs.Any( P => P.CODIGOTIPO == cli.CODIGO 
                                                           && P.TIPO == "R"
                                                           && P.REVISTA == DropDownListRevistas.Text )
                                         orderby CT.EMAIL
                                         select new { 
                                                        cli.CODIGO
                                                      , cli.RAZAO
                                                      , CT.EMAIL 
                                                    };//nesse caso, email vira da tabela contato
    
                    var sourceClientesFiltrado = sourceClientes.Distinct(new DistinctItemComparer());
    
                    return sourceClientesFiltrado;
                }

    Dá uma lida nos links que eu te indiquei que eles vão te ajudar.

    Boa sorte!


    • Marcado como Resposta Marcos SJ sexta-feira, 4 de setembro de 2015 17:32
    sexta-feira, 4 de setembro de 2015 17:26

Todas as Respostas

  • Como não duplicar meu select campo email ?

    sourceClientes = fromcli inmdc.CLIENTES

    joinCT inmdc.CONTATOS oncli.CODIGO equalsCT.CLIENTE

    where

    CT.EMAIL != ""

    //CATEGORIAS

    &&

    mdc.HISTCATREVs.Any(P => P.CODIGOTIPO == cli.CODIGO &&

    P.TIPO == "C"&&

    P.CATEGORIA == DropDownListCategorias.Text)

    //REVISTAS

    &&

    mdc.HISTCATREVs.Any(P => P.CODIGOTIPO == cli.CODIGO &&

    P.TIPO == "R"&&

    P.REVISTA == DropDownListRevistas.Text)

    orderbyCT.EMAIL

    selectnew

    { cli.CODIGO, cli.RAZAO, CT.EMAIL };//nesse caso, email vira da tabela contato

    • Mesclado Marcos SJ sexta-feira, 4 de setembro de 2015 14:21 Thread duplicada
    quinta-feira, 3 de setembro de 2015 21:04
  • Olá ricardoti2012,

    Tudo bem?

    Vi que você abriu a mesma thread novamente. Portanto vou mesclar estas duas threads, peço que por gentileza não crie threads duplicadas no fórum.

    Atencisoamente


    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.

    sexta-feira, 4 de setembro de 2015 14:19
  • Opa, tudo bom ricardoti2012?

    Tente criar uma classe customizada para eliminar duplicatas implementando a interface IEqualityComparer e depois aplica-la como parâmetro para o método Distinct. Segue exemplo abaixo baseado nesta thread.

    class DistinctItemComparer : IEqualityComparer<Contato> {
    
        public bool Equals(Contato x, Contato y) {
            return x.Codigo == y.Codigo &&
                x.Razao == y.Razao &&
                x.Email == y.Email;
        }
    
        public int GetHashCode(Contato obj) {
            return obj.Codigo.GetHashCode() ^
                obj.Razao.GetHashCode() ^
                obj.Email.GetHashCode();
        }
    }

    var contatosDistintos = contatos.Distinct(new DistinctItemComparer());

    Espero que isso possa te ajudar.

    • Marcado como Resposta Marcos SJ sexta-feira, 4 de setembro de 2015 14:25
    • Não Marcado como Resposta ricardoti2012 sexta-feira, 4 de setembro de 2015 14:49
    sexta-feira, 4 de setembro de 2015 14:24
  • Bom dia Samuel

    Obrigado por responder meu post

    Eu preciso colocar o código no meu select e não posso usar um comparador.

    Eu ja tinha até pensado em comparar ja que eu coloco um loop no meu outro código.

    Porem para que o usuário veja no meu contador do meu Grid eu preciso retirar o campos duplicados no meu select

    Se sua classe faz isso ótimo.

    Porem não entendi aonde ela entra no meu select ja que estou usando linq.

    No sql server eu usuário o distinct e resolveria o problema.

    Porem com o linq e bem diferente.

    Se puder me ajudar eu agradeço muito mesmo.

    Fico no aguardo.

    A paz de cristo esteja com você

    Obrigado

    sexta-feira, 4 de setembro de 2015 14:45
  • Com o linq não é tão diferente assim. Você chegou a ler todos os links que eu te indiquei? Lá explica como funciona a interface IEqualityComparer e como você pode se utilizar dela para, entre outras coisas, filtrar coleções, que é o que você precisa.

    Você vai precisar de uma segunda coleção, que recebe o resultado do método Distinct que você vai executar na coleção que vai obter como resultado da sua query. Este resultado não irá conter resultados repetidos e você pode usar com qualquer coisa que já faria com a coleção original. Só que sem repetidos.

    Seu código vai ficar mais ou menos assim, altere de acordo com suas necessidades de negócios:

    class DistinctItemComparer : IEqualityComparer<Contato> {
    
        public bool Equals(Contato x, Contato y) {
            return x.Codigo == y.Codigo &&
                x.Razao == y.Razao &&
                x.Email == y.Email;
        }
    
        public int GetHashCode(Contato obj) {
            return obj.Codigo.GetHashCode() ^
                obj.Razao.GetHashCode() ^
                obj.Email.GetHashCode();
        }
    }


                seuMetodo (seuParametro seuparametro)
                {
                    var sourceClientes = from cli in mdc.CLIENTES
                                         join CT in mdc.CONTATOS 
                                         on cli.CODIGO equals CT.CLIENTE
                                         where CT.EMAIL != "" //CATEGORIAS
                                      && mdc.HISTCATREVs.Any( P => P.CODIGOTIPO == cli.CODIGO 
                                                           && P.TIPO == "C" 
                                                           && P.CATEGORIA == DropDownListCategorias.Text ) //REVISTAS
                                      && mdc.HISTCATREVs.Any( P => P.CODIGOTIPO == cli.CODIGO 
                                                           && P.TIPO == "R"
                                                           && P.REVISTA == DropDownListRevistas.Text )
                                         orderby CT.EMAIL
                                         select new { 
                                                        cli.CODIGO
                                                      , cli.RAZAO
                                                      , CT.EMAIL 
                                                    };//nesse caso, email vira da tabela contato
    
                    var sourceClientesFiltrado = sourceClientes.Distinct(new DistinctItemComparer());
    
                    return sourceClientesFiltrado;
                }

    Dá uma lida nos links que eu te indiquei que eles vão te ajudar.

    Boa sorte!


    • Marcado como Resposta Marcos SJ sexta-feira, 4 de setembro de 2015 17:32
    sexta-feira, 4 de setembro de 2015 17:26