如果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)
My Comparer如下......
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'“
任何人都可以说明为什么会这样。
答案 0 :(得分:2)
你的问题是你实现了IEqualityComparer(Of Object),但你的列表是List(Of AT),其中AT是一个匿名类型,所以你不能实现IEqualityComparer(Of AT)。
我认为您的选择是:
答案 1 :(得分:2)
使用以下代码。
from t in db.Sites
where
!
(from t0 in db.Sites2
select new {
t0.SomeID
}).Contains(new { t.SomeID })
select t
这是基于不在条件。我想这会对你有所帮助。你正在做一些复杂的事情。
答案 2 :(得分:1)
看起来它要求你的比较器实现非通用接口IEqualityComparer
,而你的实现IEqualityComparer (Of Object)
,这是一个不同的接口。
答案 3 :(得分:1)
看起来您正在使用数据库作为后端。您无法为此提供自定义比较器,因为它无法映射到TSQL。
你试过Contains
吗?即where !List1.Contains(i.SiteID)
?