我正在使用實體框架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