Frage

Ich versuche, die „Ausnahme“ Methode auf einem LINQ Ergebnismenge zu verwenden, um eine benutzerdefinierte Implementierung zu verwenden, wenn IEqualityComparer bestimmte Ergebnisse auszuschließen, basierend auf dem Wert eines einzelnen Feld aus der Ergebnismenge.

Also, in vereinfachter Form Ich habe ...

'' 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)

Meine Comparer ist wie folgt ...

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

Ich erhalte eine ungültige Cast Exception auf der „.except“ -Linie mit der Meldung „Kann nicht das Objekt von Typ‚... insCompare‘‚System.Collections.Generic.IEqualityComparer‘zu geben“

Kann jemand Licht werfen auf, warum dies bitte sein könnte.

War es hilfreich?

Lösung

hier Ihr Problem ist, dass Sie bei der Implementierung IEqualityComparer (Of Object), aber Ihre Listen sind List (Of AT), wo AT ein anonymer Typ ist, so dass Sie nicht IEqualityComparer (Of AT) implementieren können.

Ich denke, haben Sie folgende Möglichkeiten:

  1. Deklarieren Sie eine Klasse / Struktur der SideID / AltraSocial, und wählen Sie in eine Instanz der Klasse zu halten, dann implementieren IEqualityComparer (Of NewClass).
  2. Verwenden Sie spät gebundene Anrufe (dh. Option explizit aus, wie es machst du jetzt erscheint), und legte eine .Cast (Of Object) () auf beiden Listen rufen Sie vor dem Aufruf Mit Ausnahme.

Andere Tipps

Verwenden Sie den folgenden Code ein.

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

Dies ist in nicht in einem Zustand basiert. Ich denke, das wird Ihnen helfen. U sind einige komplexe Sache zu tun.

Es sieht aus wie es ist zu fragen, dass Ihr Vergleich der nicht-generische Schnittstelle IEqualityComparer implementieren, während Ihr IEqualityComparer (Of Object) implementiert, die eine andere Schnittstelle ist.

Es sieht aus wie Sie eine Datenbank als Backend verwenden. Sie kann nicht einen benutzerdefinierten comparer dafür sorgen, da es nicht zu TSQL abgebildet werden kann.

Haben Sie Contains versucht? das heißt where !List1.Contains(i.SiteID)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top