LINQ Удалить элементы из коллекции, если нет данных - PullRequest
1 голос
/ 21 февраля 2011

У меня есть коллекция, в которой у каждого элемента есть свойство «ID».Существует таблица данных, имеющая столбец «ID».

Если в коллекции есть какое-либо значение, которого нет в базе данных, его необходимо удалить.

Можно ли это сделать с помощью LINQили коллекцию нужно повторять?

Ответы [ 4 ]

2 голосов
/ 21 февраля 2011

Если вам нужна коллекция DataRow:

dataTable.Rows.Cast<DataTable>
      .Where(dr => myCollection.Find(s => s.ID.Equals(dr["ID"])) != null)

else, если вам нужно отфильтровать коллекцию ваших объектов:

   var ids =  dataTable.Rows.Cast<DataTable>.Select(dr => Convert.ToInt32(dr["ID"]));
   var filteredCollection = myCollection.Where(s => ids.Contains(s.Id));

Если вы добавите ссылку на System.Data.DataSetExtensions, вы можете сократить его:

   var ids = dataTable.AsEnumerable().Select(dr => dr.Field<int>("ID"));
   var filteredCollection = myCollection.Where(s => ids.Contains(s.Id));
1 голос
/ 21 февраля 2011

Вот пример, но я его не тестировал

var items = new List<Item>();
var dataTable = new DataTable { Columns = { new DataColumn("ID", typeof(int)) } };
var rows = dataTable.AsEnumerable();
var itemsToRemove = items.Join(rows, item => item.ID, row => row.Field<int>("ID"), (item, row) => item);
foreach (var item in itemsToRemove)
{
    items.Remove(item);
}

Надеюсь, это поможет вам.это основано на объединении обоих на основе идентификатора.

1 голос
/ 21 февраля 2011

LINQ сам по себе выполняет запрос , а не изменение коллекции.

Два варианта:

  • Создайте новую коллекцию, используя LINQ, используя только соответствующие значения из исходной коллекции. Замените оригинальную коллекцию этим. (Не так просто, если есть несколько ссылок на оригинальную коллекцию.)
  • Используйте LINQ, чтобы создать коллекцию значений для удаления из исходной коллекции, а затем выполнить итерацию по этой отдельной коллекции, удалив элементы из исходной коллекции. Обратите внимание, что вам следует материализовать эту «коллекцию значений для удаления» (например, с помощью вызова ToList), так как в противном случае вы все равно будете перебирать исходную коллекцию при удалении из нее элементов, что приведет к исключению.

Я не знаю, что таблицы данных делают при индексировании, но если таблица большая, вы можете создать HashSet ID для начала, например,

var query = dataTable.AsEnumerable()
                     .Field<string>("ID"); 
HashSet<string> dataTableIds = new HashSet<string>(query);

Таким образом, вы можете проверить на сдерживание очень дешево.

0 голосов
/ 21 февраля 2011

Вы не хотите этого делать, потому что из-за механизма отслеживания изменений в контексте данных LINQ нет никакой гарантии, что информация, содержащаяся в коллекции, все еще будет в базе данных между запросами запросов.

Итерация по коллекции будет пустой тратой времени ... вам гораздо лучше выполнить запрос, чтобы заново заполнить коллекцию.

var query = dc.Collection.Where(c => (dc.DataTable.Select(dt => dt.Customer_ID)).Contains(c.Customer_ID));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...