将 LINQ 的 EqualityComparer 覆盖为 SQL class

Override EqualityComparer for LINQ to SQL class

我想为我的一个 LINQ 覆盖 EqualityComparer to SQL classes(由 visual studio 自动生成),这样当我寻找与 IndexOf 的匹配时,它会使用我的比较而不是它会为此做的任何事情 class。它似乎不起作用,我的覆盖没有被调用。

比较逻辑如下:

ClientFileList f = new ClientFileList();
f.ClientID = -1 * lines;
f.JobID = JobID;
f.DRSCode = aParts[0];
f.DocumentNumber = aParts[1];
f.Revision = aParts[2];
f.Title = aParts[3];
f.TitleLine2 = aParts[4];
f.TitleLine3 = aParts[5];
f.SheetNumber = aParts[6];
f.Status = aParts[7];
f.ColorCode = ColorCode;

if(oCFile.IndexOf(f)==-1)
{
    // this element is not a duplicate
    oCFile.Add(f);
}

这是我扩展的 class 来覆盖 EqualityComparer:

public partial class ClientFileList : EqualityComparer<ClientFileList>
{
    public override bool Equals(ClientFileList x, ClientFileList y)
    {
        //throw new NotImplementedException();
        return (x.DocumentNumber == y.DocumentNumber &&
                x.Revision == y.Revision);
    }

    public override int GetHashCode(ClientFileList obj)
    {
        String s = obj.DocumentNumber + obj.Revision;
        return s.GetHashCode();
        //throw new NotImplementedException();
    }
}

我希望的是,如果具有匹配的 DocumentNumber 和 Revision 的文档已经在数据库中,我不想再次添加它(这是在读取分隔文本文件并插入数据库时​​实现的) . IndexOf 上的 MSDN 文档似乎表明它将使用 EqualityComparer 。 . .但我没有看到这种行为。我做错了什么?

I want to override the EqualityComparer for one of my LINQ to SQL classes

我真的不认为你这样做。我认为您想覆盖 Equals 方法,并可能实现 IEquatable<T>EqualityComparer 用于能够比较 other 类型的对象的对象 - 例如 AgeComparer 可能派生自 EqualityComparer<Person>.

如果您重写 Equals(object)GetHashCode,并且还实施 IEquatable<T>,那么我希望 IndexOf 可以工作,假设 oCFile 是a List<ClientFileList> 或类似的东西(你没有告诉我们)。但是,这当然不会影响 LINQ to SQL 本身发出查询的方式。