2

IEqualityComparer が結果セットの単一フィールドの値に基づいて特定の結果を除外する場合、カスタム実装を使用して LINQ 結果セットで "Except" メソッドを使用しようとしています。

だから、単純化された形で私は...

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

私の比較者は次のとおりです...

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

".Except" 行で無効なキャスト例外が発生し、"型 '...insCompare' のオブジェクトを型 'System.Collections.Generic.IEqualityComparer' にキャストできません" というメッセージが表示されます。

なぜこれが喜ばれるのか、誰でも光を当てることができますか.

4

4 に答える 4

2

ここでの問題は、IEqualityComparer(Of Object)を実装することですが、リストはList(Of AT)であり、ATは匿名タイプであるため、IEqualityComparer(Of AT)を実装することはできません。

私はあなたの選択は次のとおりだと思います:

  1. SideID / SiteNameを保持するクラス/構造体を宣言し、そのクラスのインスタンスを選択してから、IEqualityComparer(Of NewClass)を実装します。
  2. レイトバウンド呼び出しを使用し(つまり、現在実行しているように見えるように、オプションを明示的にオフにします)、Exceptを呼び出す前に、両方のリストに.Cast(Of Object)()呼び出しを配置し​​ます。
于 2009-06-17T12:25:13.580 に答える
2

次のコードを使用します。

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

これは状態に基づいていません。これが役立つと思います。あなたは何か複雑なことをしています。

于 2009-06-17T12:30:43.960 に答える
1

データベースをバックエンドとして使用しているようです。TSQLにマッピングできないため、このためのカスタム比較ツールを提供することはできません

試しましたContainsか?すなわちwhere !List1.Contains(i.SiteID)

于 2009-06-17T12:24:38.700 に答える
1

あなたの比較者が非ジェネリックなインターフェースを実装するのに対し、あなたの比較者は異なるインターフェースであるを実装するように求めているようIEqualityComparerです。IEqualityComparer (Of Object)

于 2009-06-17T12:17:25.250 に答える