我正在尝试使用“除外” LINQU结果集上的方法,如果IEqualityComparer根据结果集中单个字段的值排除某些结果,则使用自定义实现。

所以,我以简化的形式......

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

任何人都可以说明为什么会这样。

有帮助吗?

解决方案

你的问题是你实现了IEqualityComparer(Of Object),但你的列表是List(Of AT),其中AT是一个匿名类型,所以你不能实现IEqualityComparer(Of AT)。

我认为您的选择是:

  1. 声明一个类/结构来保存SideID / SiteName,并选择该类的实例,然后实现IEqualityComparer(Of NewClass)。
  2. 使用后期绑定调用(即显式关闭选项,就像您现在所做的那样),并在调用Except之前在两个列表上放置.Cast(Of Object)()调用。

其他提示

使用以下代码。

    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