Как найти разницу между 2 моделями списков

#c# #list #linq

#c# #Список #linq

Вопрос:

Столкнулся с проблемой сравнения 2 списка моделей.

 public class Relations
    {
        [key]
        public int Id { get; set; }
        public int CounterpartyId { get; set; }
        public int CounterpartyTypeId { get; set; }
        public int DebTypeId { get; set; }
    }
 

У меня есть метод, который берет список этих моделей из интерфейса и список, который я беру из базы данных. когда появилась модель из интерфейса, у нее нет идентификатора, и я не добавляю идентификатор к этой модели.
например:

             var models = new List<Relations>()
            {
                new Relations
                {
                    CounterpartyId = 1,
                    CounterpartyTypeId = 1,
                    DebTypeId = 1
                },
                new Relations
                {
                    CounterpartyId = 1,
                    CounterpartyTypeId = 2,
                    DebTypeId = 1001
                }
            };

            var entity = new List<Relations>()
            {
                new Relations
                {
                    CounterpartyId = 1,
                    CounterpartyTypeId = 1,
                    DebTypeId = 1
                },
                
            };
 

Как сравниваются эти 2 списка моделей??? мне нужна модель вставки, которая имеет (CounterpartyId = 1, CounterpartyTypeId = 2, DebTypeId = 1001)

Чтобы избежать дубликатов в БД, я пытаюсь

 IEnumerable<Relations> toInsert = models.Except<Relations>(entity);
 

и попробуйте

 var test=(from m in models select m).Except(entity).ToList();
 

но они одинаковы и не могут найти данные, которых нет в базе данных

Комментарии:

1. Вы можете добавить пользовательский компаратор; смотрите Здесь . Вы можете использовать это, чтобы определить, какие поля в вашем классе соответствуют.

Ответ №1:

Как предложил Питер Смит в разделе комментариев, вы можете создать свой Comparer :

 sealed class MyComparer : IEqualityComparer<Relations>
{
    public bool Equals(Relations x, Relations y)
    {
        if (x == null)
            return y == null;
        else if (y == null)
            return false;
        else
            return x.CounterpartyId == y.CounterpartyId  amp;amp; x.CounterpartyTypeId == y.CounterpartyTypeId amp;amp; x.DebTypeId == y.DebTypeId ;
    }

    public int GetHashCode(Relations obj)
    {
        return obj.Id.GetHashCode();
    }
}
 

И используйте Except() перегрузку следующим образом:

 IEnumerable<Relations> toInsert = models.Except<Relations>(entity, new MyComparer());