Usuário com melhor resposta
Como não duplicar meu select ?

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