문제

iqualitycomparer 인 경우 사용자 정의 구현을 사용하여 LINQ 결과 세트에서 "제외"메소드를 사용하여 결과 세트에서 단일 필드의 값을 기준으로 특정 결과를 배제하려고합니다.

그래서 단순화 된 형태로 나는 ...

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

".excred"라인에서 "system.collections.generic.iequalitycomparer '를 입력하기 위해"inscompare'를 입력 할 수있는 메시지가 표시됩니다. ""

누구든지 이것이 왜 그런지에 대해 밝혀 질 수 있습니까?

도움이 되었습니까?

해결책

여기서 문제는 iqualitycomparer (Object)를 구현하지만 목록은 AT (AT)가 익명 유형이므로 iqueality comparer (AT)를 구현할 수 없다는 것입니다.

나는 당신의 선택이 다음과 같습니다.

  1. Sideid/SiteName을 보유하도록 클래스/struct를 선언하고 해당 클래스의 인스턴스로 선택한 다음 iqualitycomparer (NewClass)를 구현하십시오.
  2. 늦은 통화 (예 : 지금하고있는 것처럼 보이는 것처럼 옵션 명시 적 꺼짐)를 사용하고 호출을 제외하고 두 목록에 .cast (of 객체) ()를 넣습니다.

다른 팁

다음 코드를 사용하십시오.

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

이것은 조건이 아닌 기반입니다. 나는 이것이 당신을 도울 것이라고 생각합니다. 당신은 복잡한 일을하고 있습니다.

비교기가 비 게 릭 인터페이스를 구현하도록 요구하는 것 같습니다. IEqualityComparer, 당신은 구현되는 반면 IEqualityComparer (Of Object), 다른 인터페이스입니다.

데이터베이스를 백엔드로 사용하는 것 같습니다. 너 캔트 TSQL에 매핑 할 수 없으므로 이에 대한 사용자 정의 비교를 제공하십시오.

당신은 시도 했습니까? Contains? 즉 where !List1.Contains(i.SiteID)?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top