Entity Framework 4.0: .Equals сравнивают, чтобы найти дубли, но игнорируют ключи - PullRequest
0 голосов
/ 13 октября 2010

Я использую Entity Framework 4.0.Я хочу быть в состоянии найти дубликаты записей в EntitySet.Записи будут иметь одинаковые данные, но разные первичные ключи.Когда я делаю .Equals я получаю, что записи не равны.Я знаю, что могу переопределить .Equals, но у меня есть более 20 связанных объектов с большим количеством полей.

Существует ли метод сравнения, который будет проверять все поля, кроме ключа, чтобы сказать мне, если они одинаковы?Не могу представить, что это еще не решено.

Спасибо за любой совет ...

Ответы [ 2 ]

0 голосов
/ 13 октября 2010

Я решил сгенерировать код для создания переопределений .Equals(), используя шаблон T4. Это выглядит примерно так:

<#@ 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().

0 голосов
/ 13 октября 2010

Вместо переопределения метода .Equals () вы можете использовать его перегрузку, чтобы указать свой собственный IEqualityComparer ...

Кроме того, если вы просто хотите получить дуплицированные или отличные значения, вы можете использовать.Distinct (), или вы можете выполнить групповой запрос LINQ, чтобы изолировать критерии, которые имеют более одного соответствия ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...