Учитывая, что первая таблица данных содержит основные данные, а вторая таблица имеет необходимые идентификаторы данных, мне нужно удалить строки из первой таблицы, которых нет во второй таблице. Я пытаюсь использовать LINQ.
Таблица данных 1:
Таблица данных 2:
Таблица результатов:
Я попробовал этот запрос:
var qry1 = datatable1.AsEnumerable().Select(a => new { NO.ToString() });
var qry2 = datatable2.AsEnumerable().Select(b => new { NO.ToString() });
var newTable = qry1.Except(qry2);
но я получаю строки, которых нет. Многие процессы я пытался получить результат.
Я предполагаю, что (1) вы хотите выбрать совпадающие строки из ваших таблиц данных, а не удалять несовпадающие строки из источника, и (2) вы хотите, чтобы в ваших результатах были целые строки, а не только значения столбца NO
.
Возможно, вам понадобится что-то из следующего:
var query =
from t1 in datatable1.AsEnumerable()
join t2 in datatable2.AsEnumerable() on t1.NO equals t2.NO
select t1;
var query = datatable1.AsEnumerable()
.Where(t1 => datatable2.AsEnumerable().Select(t2 => t2.NO).Contains(t1.NO));
var query = datatable1.AsEnumerable()
.Where(t1 => datatable2.AsEnumerable().Any(t2 => t2.NO == t1.NO);
var selectedKeys = datatable2.AsEnumerable().Select(t2 => t2.NO).ToHashSet();
var query = datatable1.AsEnumerable().Where(t1 => selectedKeys.Contains(t1.NO));
Если коллекция datatable2
большая, я бы склонился к версиям join
или HashSet
для повышения эффективности. HashSet
поиск выполняется намного быстрее, чем повторяющееся Enumerable
сканирование.
Попробуйте
Intersect
вместоExcept
?