我正在使用实体框架4.0。我希望能够在EntitySet中查找重复的记录。记录将具有相同的数据,但具有不同的主键。当我做一个.Equals时,我得到的记录是不相等的。我知道我可以覆盖.Equals,但我有超过20个相关的实体,每个都有很多字段。实体框架4.0:.Equals比较查找dups但忽略键
是否有比较方法可以查看除键之外的所有字段以告诉我它们是否相同?
看起来像这样会是一个普遍的问题,我无法想象它还没有被解决。
感谢您的任何意见...
我正在使用实体框架4.0。我希望能够在EntitySet中查找重复的记录。记录将具有相同的数据,但具有不同的主键。当我做一个.Equals时,我得到的记录是不相等的。我知道我可以覆盖.Equals,但我有超过20个相关的实体,每个都有很多字段。实体框架4.0:.Equals比较查找dups但忽略键
是否有比较方法可以查看除键之外的所有字段以告诉我它们是否相同?
看起来像这样会是一个普遍的问题,我无法想象它还没有被解决。
感谢您的任何意见...
我解决了使用T4模板生成.Equals()
覆盖的代码。它是这样的:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.IO" #>
<#@ assembly name="System.Data.Entity" #>
<#@ assembly name="C:\<MyProjectLibPath>\bin\Debug\MyLib.dll" #>
<#@ import namespace="MyNamespace.Models" #>
<#
var className = "<MyClass>"; // <-- change this to class name
var stringProps = typeof(<MyClass>).GetProperties();
#>
namespace MyNamespace.Models
{
partial class <#= className #>
{
public override bool Equals(object obj)
{
if (obj == null) return false;
if (GetType() != obj.GetType()) return false;
var section = obj as <#= className #>;
if (section == null) return false;
return
<# for(var i=0; i<stringProps.Length; i++)
{
var element = stringProps[i];
if(element.Name != "ClaimRecId" && element.Name != "EntityState" && element.Name != "EntityKey"
&& element.Name != "EntityState" && element.Name != "MAEW_FILE_REC_SECTION" && !element.Name.EndsWith("Reference")) { #>
section.<#= element.Name #> == <#= element.Name #> <#= string.Format("{0}",(i<(stringProps.Length-5))?"&&":"") #>
<# }
} #>;
}
} // class
} // namespace
我还发现,ReSharper的将产生.Equals()
覆盖。
而不是重写.Equals()方法,你可以使用它的过载指定自己的IEqualityComparer ...
另外,如果你只想去-duped或不同的值,则可以使用.Distinct()方法,也可以通过组查询,以分离具有多于一个的匹配准则做LINQ ...
var sample = from a in sampleA join b in sampleB
on a.SampleProperty equals b.SampleProperty
into c select c.FirstOrDefault();
谢谢fdfrye,我考虑过这两种方法。不幸的是,他们太麻烦了。我有超过400个单独的字段来共同关联20个相关的表。我正在寻找能够将整个实体与其20个相关表进行比较的东西,或者至少可以将单个相关表进行比较的东西。事实是,每个记录都会有一个独特的关键,这使得它不同。 – Weej 2010-10-12 22:13:34