none
Distinct com C# dentro de um List<> RRS feed

  • Pergunta

  • Bom dia Pessoal !

    Preciso da ajuda de vocês, estou fazendo um select no banco de dados e retornando uma lista, neste select eu faço join porque preciso recuperar alguns dados de outras tabelas, só que me retornam dados duplicados ou as vezes não aprece o dado que preciso, enfim preciso criar um distinc nesta lista para alguns parâmetros, eu também populo um Grid com estas informações que depois eu exporto em forma de protocolo para envio ao cliente, por isso preciso tanto do Distinct. Segue meu código abaixo.

    public List<Escelsa> BuscaDoacoes(string strdata)
        {
            Model.Entities_PST ctx = new Model.Entities_PST();
            try
            {
                List<Escelsa> q;

                q = (from f in ctx.tb_financiamento
                     join d in ctx.tb_doador on f.id_doador equals d.id_doador
                     join doacao in ctx.tb_doacao on f.id_doacao equals doacao.id_doacao
                     where f.mesano == strdata && doacao.id_opcao_doador == 1 && d.cdc_doador != 
                     null && d.cdc_doador != "" || doacao.id_opcao_doador == 7
                     select new Escelsa
                     {
                         iddoador = d.id_doador,
                         cdc = d.cdc_doador,
                         vlrP = f.valor_parcela,
                         init = f.data_inicio,
                         iddoacao = doacao.id_doacao,
                         mesano = f.mesano,
                         idop = doacao.id_opcao_doador,
                         registro = f.registro_b,
                         nparcela = f.num_parcela,
                         dtcob = f.data_cobranca,
                         dtfinco = f.datafim_contrato,
                         narq = f.nome_arq_envio,
                         narqret = f.nome_arqu_retorno,
                         status = f.id_situacao_contrato == 1 ? "Ativo" : "Desativado",
                         tipo = doacao.tb_opcao_doador.dcr_opcao_doador,
                         ndoador = d.nome_doador,
                         carteira = d.tb_cartela_operador.dcr_cartela
                     }).OrderBy(x => x.vlrP).ToList();

                return q;


            }
            catch (System.Exception)
            {

                Faz alguma Coisa;
            }
        }

    Eu recupero o "q" e populo o grid.

    Obrigado 

    quinta-feira, 29 de agosto de 2013 13:13

Respostas

  • Boa Tarde,

    O que você precisa é isso aqui:

    var sql= (from u in db.USER
              join c in db.CONSULT on u.IdUser equals c.IdUser
              select new Usuers 
                     {  
                        IdUser = c.IdUser, 
                        DateCreate=c.DateCreate, 
                        IdTypeConsult = c.IdTypeConsult, 
                        Sex=u.Sex 
                     }).ToList().Distinct(new UsuersComparer);
    
    
    // this class is used to compare two objects of type Usuers to remove 
    // all objects that are duplicates only by field IdUser
    public class UsuersComparer : IEqualityComparer<Usuers>
    {
        public bool Equals(Usuers x, Usuers y)
        {
            if (x.IdUser == y.IdUser)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    
        public int GetHashCode(Usuers obj)
        {
            return obj.IdUser.GetHashCode();
        }
    }

    • Sugerido como Resposta Bruno Sato quarta-feira, 4 de setembro de 2013 19:31
    • Marcado como Resposta Luciano Auad sexta-feira, 6 de setembro de 2013 11:16
    quarta-feira, 4 de setembro de 2013 19:31

Todas as Respostas

  • Tenta colocar :

    .Distinct().OrderBy(x => x.vlrP).ToList();

    no Lugar de :

    .OrderBy(x => x.vlrP).ToList();

    Abraços. 


    Marcio S Silva | MCP |marsosil@ovi.com|http://marsosi.blogspot.com.br

    • Sugerido como Resposta Márcio S Silva quinta-feira, 29 de agosto de 2013 13:31
    quinta-feira, 29 de agosto de 2013 13:31
  • Luciano,

    Você pode utilizar o método .Distinct() no seu LINQ


    Ricardo Minoru Makiyama



    quinta-feira, 29 de agosto de 2013 13:32
  • Boa Tarde,

    O que você precisa é isso aqui:

    var sql= (from u in db.USER
              join c in db.CONSULT on u.IdUser equals c.IdUser
              select new Usuers 
                     {  
                        IdUser = c.IdUser, 
                        DateCreate=c.DateCreate, 
                        IdTypeConsult = c.IdTypeConsult, 
                        Sex=u.Sex 
                     }).ToList().Distinct(new UsuersComparer);
    
    
    // this class is used to compare two objects of type Usuers to remove 
    // all objects that are duplicates only by field IdUser
    public class UsuersComparer : IEqualityComparer<Usuers>
    {
        public bool Equals(Usuers x, Usuers y)
        {
            if (x.IdUser == y.IdUser)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    
        public int GetHashCode(Usuers obj)
        {
            return obj.IdUser.GetHashCode();
        }
    }

    • Sugerido como Resposta Bruno Sato quarta-feira, 4 de setembro de 2013 19:31
    • Marcado como Resposta Luciano Auad sexta-feira, 6 de setembro de 2013 11:16
    quarta-feira, 4 de setembro de 2013 19:31
  • OKasdfasdfasdf
    quarta-feira, 4 de setembro de 2013 20:22
  • Luciano,

    Será que o Distinct seria a solução mais ideal?

    Talvez isso seja apenas uma "gambiarra" para resolver seu problema.

    Tente rever seu join e veja se colocou todas as referencias no join, para garantir que não irá retornar nenhum valor desnecessário.


    Julio Arruda
    __________________________________
    Se foi util, marque como resposta
    .Net Coders
    Coordenador .Net Coders

    • Sugerido como Resposta Julio ArrudaMVP quinta-feira, 5 de setembro de 2013 18:35
    quinta-feira, 5 de setembro de 2013 18:35