#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());