Jump to content
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)

 

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Jonatas Provido
      Pessoal estou mexendo em um relatório porem quando ele me retorna ele me traz ainda em duplicidade.
      veja na imagem 
      se aguem puder me dar uma luz. 
       
      SELECT DISTINCT ITE.CODPROD,
             ITE.SEQUENCIA,
             PRO.DESCRPROD,
             ITE.AD_COMPLEMENTO,
             PAP.CODPROPARC,
             ITE.CONTROLE,
             ITE.USOPROD,
              (CASE
                WHEN VOA.CODPROD IS NULL THEN ITE.QTDNEG
                WHEN VOA.DIVIDEMULTIPLICA = 'D' THEN ITE.QTDNEG * VOA.QUANTIDADE
                ELSE ITE.QTDNEG / VOA.QUANTIDADE
              END) AS QTDNEG,
              (CASE
                WHEN VOA.CODPROD IS NULL THEN ITE.VLRUNIT
                WHEN VOA.DIVIDEMULTIPLICA = 'D' THEN ITE.VLRUNIT / VOA.QUANTIDADE
                ELSE ITE.VLRUNIT * VOA.QUANTIDADE
              END) AS VLRUNIT,
            ITE.CODVOL,
            ITE.VLRDESC,
            ITE.QTDNEG * ITE.VLRUNIT AS TOTALITEM,
            ITE.VLRTOT - ITE.VLRDESC AS TOTLIQ,
            (CASE WHEN ITE.DTINICIO IS NULL THEN
            CAB.DTPREVENT ELSE ITE.DTINICIO END) AS DTPREV,
            USU.NOMEUSU,
            ITE.VLRIPI,
            (ITE.VLRIPI / (ITE.VLRTOT - ITE.VLRDESC)) * 100 AS PERCIPI
      FROM TGFITE ITE
           INNER JOIN TGFCAB CAB ON (CAB.NUNOTA = ITE.NUNOTA)
           INNER JOIN TGFPRO PRO ON(ITE.CODPROD = PRO.CODPROD)
           LEFT JOIN TSIUSU USU ON (USU.CODUSU = ITE.AD_CODUSU)
           LEFT JOIN TGFPAP PAP
           ON ITE.CODPROD = PAP.CODPROD
           AND CAB.CODPARC = PAP.CODPARC
           AND ITE.CODVOL = PAP.UNIDADEPARC
           LEFT JOIN TGFVOA VOA ON(
           VOA.CODPROD = ITE.CODPROD AND
           VOA.CODVOL = ITE.CODVOL AND
             ((ITE.CONTROLE IS NULL AND VOA.CONTROLE = ' ')
             OR (ITE.CONTROLE IS NOT NULL AND ITE.CONTROLE = VOA.CONTROLE))
                             )
            WHERE  CAB.NUNOTA = 55854 AND  ITE.SEQUENCIA > 0
      ORDER BY ITE.SEQUENCIA

    • By brunoogm
      Pessoal tenho uma tabela no php cujo resultado do select vindo do bd vem no seguinte formato:
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Bacon Cheddar                          1          60.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Chicken Club Sandwich            1          45.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Philly Cheese Steak                   1          50.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Smoke House                             1          55.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Stream Miller                              1          35.00
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       
      E eu gostaria de fazer um select para que nao repita os dados iguais e que a tabela viesse assim:
       
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                                                                                                                      Bacon Cheddar                          1           60.00
                                                                                                                                                      Chicken Club Sandwich           1            45.00
      26    46        15/05/2019 13:57:25         Dinheiro                  Pendente                           Philly Cheese Steak                   1            50.00
                                                                                                                                                      Smoke House                             1            55.00
                                                                                                                                                      Stream Miller                              1            35.00
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       
      Alguem pode me ajudar, qual seria a melhor forma de fazer ?

      Essa tabela é gerada com um while no php entao se alguem saber uma outra maneira de montar isso aceito dicas.
       
      php: 
      -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      echo "<tr role='row' class='odd'>";
                                                      echo "<td class='sorting_1'>" .$resultado['CodigoComanda']. "</td>";
                                                      echo "<td>" .$resultado['Nome']."</td>";
                                                      echo "<td>" .$resultado['Quantidade']."</td>";
                                                      echo "<td>" .$resultado['Preco']."</td>";
                                                      echo "<td>" .$resultado['Metodos']."</td>";
                                                      echo "<td>" .$resultado['DataPedido']."</td>";
                                                      echo "<td>" .$resultado['Situacao']."</td>";
      echo "</tr>";
      -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       
      vlw pessoal
       
    • By brunoogm
      Pessoal tenho uma tabela no php cujo resultado do select vindo do bd vem no seguinte formato:
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Bacon Cheddar                          160.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Chicken Club Sandwich            145.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Philly Cheese Steak                   150.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Smoke House                             155.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Stream Miller                              135.00
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       
      E eu gostaria de fazer um select para que nao repita os dados iguais e que a tabela viesse assim:
       
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                 46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Bacon Cheddar                          160.00
                                                                                                                                                      Chicken Club Sandwich            145.00
                                                                                                                                                      Philly Cheese Steak                   150.00
       Smoke House                             155.00
      26       46        15/05/2019 13:57:25         Dinheiro                  Pendente                        Stream Miller                              135.00
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       
    • By 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.
    • By 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!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.