Question

J'essaie d'utiliser le " Except " méthode sur un ensemble de résultats LINQ à l'aide d'une implémentation personnalisée si IEqualityComparer exclut certains résultats en fonction de la valeur d'un seul champ de l'ensemble de résultats.

Donc, sous une forme simplifiée, j'ai ...

'' Get collection of published sites...
Dim List1  = (From i In db.Sites _
              Where (i.StatusID = published) _
              Select i.SiteID, _
                     i.SiteName)

'' Find those with a pending site, but exclue all those whose SiteID is in List1...
Dim insComparer = New insCompare
Dim List2 = (From i In db.Sites _
             Where (i.StatusID = pending) _
             Select i.SiteID, _
                    i.SiteName).Except(List1, insComparer)

Ma comparaison est la suivante ...

Public Class insCompare
    Implements System.Collections.Generic.IEqualityComparer(Of Object)

    Public Function Equals1(ByVal x As Object, ByVal y As Object) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of Object).Equals
        Return IIf(x.SiteID = y.SiteID, True, False)

    End Function

    Public Function GetHashCode1(ByVal x As Object) As Integer Implements System.Collections.Generic.IEqualityComparer(Of Object).GetHashCode
        Return x.SiteID.ToString.ToLower.GetHashCode()

    End Function

End Class

J'obtiens une exception de diffusion non valide sur l'option ".Except". ligne avec le message "Impossible de convertir l'objet de type '... insCompare' en 'System.Collections.Generic.IEqualityComparer' ',

Quelqu'un peut-il expliquer pourquoi cela pourrait être s'il vous plaît.

Était-ce utile?

La solution

Votre problème ici est que vous implémentez IEqualityComparer (Of Object), mais vos listes sont List (Of AT), où AT est un type anonyme. Vous ne pouvez donc pas implémenter IEqualityComparer (Of AT).

Je pense que vos choix sont les suivants:

  1. Déclarez une classe / structure pour contenir le SideID / SiteName, sélectionnez une instance de cette classe, puis implémentez IEqualityComparer (Of NewClass).
  2. Utilisez des appels à connexion tardive (c'est-à-dire. option explicite désactivée, comme il semble que vous le fassiez maintenant), et placez un appel .Cast (Of Object) () sur les deux listes avant d'appeler Except.

Autres conseils

Utilisez le code suivant.

    from t in db.Sites
where
  !
    (from t0 in db.Sites2
    select new {
      t0.SomeID
    }).Contains(new { t.SomeID })
select t

cela est basé dans pas en condition. Je crois que ceci vous aidera. Vous faites quelque chose de complexe.

On dirait qu'il demande à votre comparateur d'implémenter l'interface non générique IEqualityComparer , alors que le vôtre implémente IEqualityComparer (Of Object) , qui est une interface différente.

On dirait que vous utilisez une base de données en tant que back-end. Vous ne pouvez pas fournir un comparateur personnalisé à cet effet, car il ne peut pas être mappé sur TSQL.

Avez-vous essayé contient ? c'est-à-dire où! List1.Contains (i.SiteID) ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top