将 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 本身发出查询的方式。
我想为我的一个 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 本身发出查询的方式。