Ir para conteúdo
ZecaLoteiro

[Resolvido] LINQ Distinct - IEquatable - Não funcionando

Recommended Posts

Boa tarde,

 

Estou tentando usar o DISTINCT em uma consulta LINQ porém não está funcionando.

Implementei tanto a interface IEquatable quando a interface IEqualityComparer mas mesmo assim não é possível distinguir as instâncias.

 

Alguém já passou por isso? Poderia ajudar?

Desde já obrigado.

 

Public Class Teste
  Implements IEquatable(Of Teste), IEqualityComparer(Of Teste)
  Private _Codigo As Integer
  Public Property Codigo() As Integer
    Get
      Return _Codigo
    End Get
    Set(ByVal value As Integer)
      _Codigo = value
    End Set
  End Property
  Public Sub New(id As Integer)
    Me.Codigo = id
  End Sub
  
  Public Overrides Function Equals(obj As Object) As Boolean
    Return DirectCast(obj, Teste).Codigo = Me.Codigo
  End Function

  Public Function Equals1(other As Teste) As Boolean Implements IEquatable(Of Teste).Equals
    Return Me.Codigo = other.Codigo
  End Function

  Public Function Equals2(x As Teste, y As Teste) As Boolean Implements IEqualityComparer(Of Teste).Equals
    Return x.Codigo = y.Codigo
  End Function

  Public Function GetHashCode1(obj As Teste) As Integer Implements IEqualityComparer(Of Teste).GetHashCode
    Return DirectCast(obj, Teste).Codigo
  End Function
End Class

Testando:

 

Dim p1 As New Teste(78)
Dim p2 As New Teste(78)
Dim l As New List(Of Teste) From {p1, p2}
MsgBox(l.Distinct().Count())
MsgBox(l.Distinct().ToList().Count)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na vdd eu precisei criar uma classe separada implementando a interface IEqualityComparer e passá-la como parâmetro no método distinct:

 

Public Class TesteEqualityComparer 
    Implements IEqualityComparer(Of Teste)

    Public Function Equals2(x As Teste, y As Teste) As Boolean Implements IEqualityComparer(Of Teste).Equals
        Return x.Codigo = y.Codigo
    End Function

    Public Function GetHashCode1(obj As Teste) As Integer Implements IEqualityComparer(Of Teste).GetHashCode
        Return obj.Codigo.GetHashCode()
    End Function
End Class


MsgBox(l.Distinct(New TesteEqualityComparer()).Count())

 

 

Resolvido, obrigado pela força.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por abucarub
      Olá a todos os "Delpheiros" de plantão. 

      Estou com uma dúvida quanto a LINQ no Delphi. 
      Hoje eu vi um vídeo demonstrando o uso de um ORM para Delphi. 
      Gostaria de entender como funciona o seguinte trecho de código, mais especificamente esse trecho Where( Linq['OrderId'] >= 30 ): 
       
      Orders := Manager.Find<TOrder>    .Where( Linq['OrderId'] >= 30  )    .OrderBy('CompanyName')    .List;  
       
      alguém saberia me explicar? 

      Sei que é retornado uma lista de pedidos, mas minha dúvida é, como tratar um método para receber uma expressão e dentro dele saber quais os valores passados para converter essa expressão em SQL. 
      Pois o trecho Where( Linq['OrderId'] >= 30 ) se transforma em WHERE ORDER_ID >= 30 dentro desse método. 

      Espero que tenha conseguido explicar rs 

      Obrigado.
    • Por Renan Cabral
      Caros,
      Preciso de uma grande ajuda e não estou conseguindo avançar.
       
      Tenho um banco de dados MySQL com 1 tabela que contem mais de 8.000.000 campos. Basicamente ela é assim (exemplo):
      ID ID_Equipamento Valor1 Valor2 5000 10 fdas 341341 4999 9 fdas 15145 4998 8 fasfa 4351 4997 7 fdafd 415 4996 3 das 67467 4995 2 dasdasdas 7 4994 1 qgrgbsg 74 4993 9 bsgb 423527 4992 8 sgarhy 6 4991 6 bsbsgb 8461546 4990 5 rwrqrqrgaf 5 4989 4 fvafdv 87 4988 3 afvafg 85 4987 1 afvafg 85 4986 5 ag 634 4985 3 gfag 2 4984 2 fdaga 51 4983 9 gfaga 431 4982 8 gffga 245262653 4981 6 gfa 2  
      Onde ID é um auto incrementador na hora da inserção de um dado.
      E ID_Equipamento é a referência de qual equipamento as informações são.
       
      Estou precisando pegar os últimos valores (Valor1, Valor2) de cada ID_Equipamento (Todos os ID_Equipamentos - 1 a 10, mas somente o último cadastrado).
      O último valor seria pelo último ID cadastrado daquele ID_Equipamento
      Nesse caso seria:
      ID ID_Equipamento Valor1 Valor2 5000 10 fdas 341341 4999 9 fdas 15145 4998 8 fasfa 4351 4997 7 fdafd 415 4996 3 das 67467 4995 2 dasdasdas 7 4994 1 qgrgbsg 74         4991 6 bsbsgb 8461546 4990 5 rwrqrqrgaf 5 4989 4 fvafdv 87
       
       
      Já tentei utilizar o DISTINCT, porém ele só retorna uma coluna com o ID_Equipamento:
      ID_Equipamento 10 9 8 7 3 2 1 6 5 4  
       
      Há alguma possibilidade de fazer o que eu quero fazer? Ou usando group by? ou MAX(ID)?
      Depois que conseguir fazer no MySQL, irei passar pro PHP e assim o tempo não pode ser tão alto para a execução...
       
      Grato!
    • Por Alessandro Almeida
      Prezados,
      Estou precisando somar a coluna QUANTIDADE que são consultadas com um "DISTINCT material".
      Segue código até o "DISTINCT material" 
      ... $busca_query = mysql_query("SELECT distinct material FROM material WHERE material LIKE '%$busca%' AND quantidade LIKE '%$busca1%' ORDER BY material ASC")or die(mysql_error());//faz a busca com as palavras enviadas if (empty($busca_query)) { //Se nao achar nada, lança essa mensagem     echo "Nenhum registro encontrado."; } // quando existir algo em '$busca_query' ele realizará o script abaixo. while ($dados = mysql_fetch_array($busca_query)) { ?>     <tr width="100%">                 <td width="82%"><?php echo "$dados[material]<br />";?></td>             <td width="10%"><?php echo "$dados[quantidade] <br />";?> ...
    • Por André Guilherme Hoffmann Rosa
      Olá pessoal,
       
      Estou usando esta instrução para obter estes resultados que estão no anexo:
       
      SELECT * FROM servicos s WHERE s.tios_id = (SELECT MAX(t.idtios) FROM tios t WHERE t.idtiOs = s.tios_id) ORDER BY s.statusServicos DESC, s.tios_id DESC
       
      O s.tios_id não pode repetir. Preciso que esta consulta retorne somente 4 linhas, como viram, só existe 4 s.tios_id.
       
      Se uso DISTINCT no s.tios_id, a consulta me retorna somente 4 linhas como eu quero, porem as outras colunas somem.
       
      Alguem? Please!
       

    • Por CamilaLopez
      Tenho uma tabela com dados de vale transporte dos meus funcionários da empresa:
      nome ! valor1 ! valor2 ! valor3 teste1 ! 6.50 ! 0.00 ! 0.00 teste2 ! 4.30 ! 2.80 ! 1.10 teste3 ! 8.40 ! 1.10 ! 0.00 teste4 ! 2.85 ! 1.10 ! 0.00 onde é possível o funcionário pegar até 3 linhas de ônibus para vir ao trabalho, por isso tenho estas três colunas.
      O problema que estou passando é o seguinte, quero retornar os dados das três colunas sem repetição, onde eu tenha todos valores de linhas de ônibus dos funcionários.
      Preciso que me retorne se possível em uma única coluna os dados sem repetir, sem valores '0.00' e ordenado ascendente :
      resultado
      1.10 2.80 2.85 4.30 6.50 8.40
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.