Я пытаюсь объединить данные из двух отдельных запросов с помощью C#. Данные расположены на отдельных серверах, или я просто хотел бы объединить запросы. Я хочу обновить данные в одном из столбцов первого набора данных с данными в одном из столбцов второго набора данных, соединяясь с другим столбцом.Как использовать LINQ для обновления datatable с помощью SqlDataReader?
Вот то, что я до сих пор:
ds.Tables[3].Columns[2].ReadOnly = false;
List<object> table = new List<object>();
table = ds.Tables[3].AsEnumerable().Select(r => r[2] = reader.AsEnumerable().Where(s => r[3] == s[0])).ToList();
ToList()
только для отладки. Подводя итог, ds.Tables[3].Rows[2]
- это столбец, который я хочу обновить. ds.Tables[3].Rows[3]
содержит ключ, к которому я хочу присоединиться.
В считывателе первый столбец содержит ключ соответствия ds.Tables[3].Rows[3]
, а второй столбец содержит данные, которые я хочу обновить ds.Tables[3].Rows[2]
.
Ошибка я получаю это
Невозможно привести объект типа «WhereEnumerableIterator
1[System.Data.IDataRecord]' to type 'System.IConvertible'.Couldn't store <System.Linq.Enumerable+WhereEnumerableIterator
1 [System.Data.IDataRecord]> в Цитирование дилеров Колонна. Ожидаемый тип - Int32.
Где я иду не так с моей LINQ?
EDIT:
Я обновил линию, где обновление происходит
table = ds.Tables[3].AsEnumerable().Select(r => r[2] = reader.AsEnumerable().First(s => r[3] == s[0])[1]).ToList();
но теперь я получаю
последовательность не содержит соответствующий элемент
Для запись, последовательность содержит соответствующий элемент.
Возможно, стоит посмотреть на связанные серверы, если это станет более частым шагом вперед, вместо того, чтобы исправить проблему в коде. В долгосрочной перспективе это вызовет у вас дополнительные проблемы с производительностью и головные боли, чем это стоит. – user2366842
Linq для _querying_, а не _updating_. Вы пытаетесь создать запрос Linq, который имеет побочные эффекты в 'Select', который не является правильным использованием Linq. Вместо этого вы должны использовать традиционный цикл 'for' или' foreach'. –
@ DStanley это плохая практика использования LINQ для обновления? Я сделал это в прошлом. Я предпочитаю его «foreach», потому что он более краткий. Я знаю, как это сделать с операторами 'foreach', но я хочу использовать LINQ, в частности, для обозначения точек. – Adam