사용자 정의 비교를 사용하는 것을 제외하고 LINQ
-
06-07-2019 - |
문제
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)를 구현할 수 없다는 것입니다.
나는 당신의 선택이 다음과 같습니다.
- Sideid/SiteName을 보유하도록 클래스/struct를 선언하고 해당 클래스의 인스턴스로 선택한 다음 iqualitycomparer (NewClass)를 구현하십시오.
- 늦은 통화 (예 : 지금하고있는 것처럼 보이는 것처럼 옵션 명시 적 꺼짐)를 사용하고 호출을 제외하고 두 목록에 .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)
?
제휴하지 않습니다 StackOverflow