实体框架4.0:.Equals比较查找重复但忽略密钥

时间:2010-10-12 21:21:18

标签: entity-framework

我正在使用Entity Framework 4.0。我希望能够在EntitySet中找到重复的记录。记录将具有相同的数据但主键不同。当我做.Equals时,我得知记录不相等。我知道我可以覆盖.Equals,但我有超过20个相关实体,每个都有很多字段。

是否有比较方法可以查看除键以外的所有字段,告诉我它们是否相同?

似乎这是一个常见的问题,我无法想象它还没有得到解决。

感谢您的任何建议......

2 个答案:

答案 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();

http://msdn.microsoft.com/en-us/library/ms132151.aspx

答案 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()覆盖。