2017-01-13 6 views
1

У меня есть два списка в моем приложении C#, как следующее (имена):Самый простой способ сравнения двух списков в C# с помощью LINQ и добавления недостающих элементов для класса сущностей

- prepared 
- DBList 

Список prepard из TransactionDetails типа содержит недостающие элементы которые мне нужно добавить в DBList.

Так, например, если у меня есть эти пункты в подготовленном списке, как следующие:

TransactionID 

1 
2 
3 
4 
5 
6 
7 
8 
9 

И мой DBList имеет:

TransactionID 
1 
2 
3 
4 
5 
6 

Я хочу, чтобы сравнить эти два списка, найти соответствующие TransactionIDs, которые а не в DBList, а затем добавить их в DBList. После этого я очищу подготовленный список и сохраню изменения в БД;

Это то, что я сделал до сих пор:

var newList = prepared.Intersect(DBList).ToList(); 
prepared.Clear(); 
ctx.EbayUserTransactions.AddRange(newList); 
ctx.SaveChanges(); 

Но список NewList всегда пусто по какой-то причине .. Как я могу сделать это правильно?

Edit, выход DBList элементов будет:

TransactionID 

    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
+0

Вы пробовали 'prepared.Except (DBList) .ToList()'? Использует ли DBList IEnumerable ? –

+0

@ MatteoMarciano-MSCP Да, но как метод Except знает, какой атрибут сравнивать в двух списках ... Атрибут, с которым я их сравниваю, - TransactionID – User987

+0

Не имел большого представления о форме вашего класса –

ответ

3

Вы можете использовать LINQ:

DBList.AddRange(prepared.Where((i) => DBList.FindIndex((el) => el.Transaction.ID == i.TransactionID) == -1)); 
+0

Ничего себе гораздо проще, чем я мог себе представить. Держись, я попробую! :) – User987

+0

это дает мне исключение: Невозможно создать постоянное значение типа «DB_Layer.EbayUserTransactions». В этом контексте поддерживаются только примитивные типы или типы перечислений – User987

+1

@ User987, см. Отредактированный ответ –