我正在使用Entity Framework 4.0。我希望能够在EntitySet中找到重复的记录。记录将具有相同的数据但主键不同。当我做.Equals时,我得知记录不相等。我知道我可以覆盖.Equals,但我有超过20个相关实体,每个都有很多字段。
是否有比较方法可以查看除键以外的所有字段,告诉我它们是否相同?
似乎这是一个常见的问题,我无法想象它还没有得到解决。
感谢您的任何建议......
答案 0 :(得分:0)
不是覆盖.Equals()方法,而是可以使用它的重载来指定自己的IEqualityComparer ......
此外,如果您只想要去掉或者不同的值,可以使用.Distinct()方法,或者您可以执行LINQ group-by查询来隔离具有多个匹配项的标准... < / p>
var sample = from a in sampleA join b in sampleB
on a.SampleProperty equals b.SampleProperty
into c select c.FirstOrDefault();
答案 1 :(得分:0)
我决定使用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()
覆盖。