#c# #datatable
Вопрос:
Для моего приложения есть несколько отдельных таблиц данных, и мне нужно создать новую таблицу данных на основе соответствующих идентификаторов. Мне нужно выполнить этот процесс несколько раз, поэтому я создал функцию, чтобы не дублировать код, я сделал это так:
private static DataTable CloneTable(DataTable originalTable, DataTable newTable, DataTable targetTable, string addedColumn, string columnToExtract, bool multipleConditions = false, string secondColumnName = null, string secondColumnConditon= null) { newTable = originalTable.Clone(); newTable.Columns.Add(addedColumn); foreach (DataRow row in originalTable.Rows) { DataRow[] rowsTarget; if (multipleConditions == false) { rowsTarget = targetTable.Select(string.Format("ItemId='{0}'", Convert.ToString(row["ItemId"]))); } else { rowsTarget = targetTable.Select(string.Format("ItemId='{0}' AND {1} ='{2}'", Convert.ToString(row["ItemId"]), secondColumnName, secondColumnConditon)); } if (rowsTarget != null amp;amp; rowsTarget.Length gt; 0) { string data = rowsTarget[0][columnToExtract].ToString(); var lst = row.ItemArray.ToList(); lst.Add(data); newTable.Rows.Add(lst.ToArray()); } else { string data = ""; var lst = row.ItemArray.ToList(); lst.Add(data); newTable.Rows.Add(lst.ToArray()); } } return newTable; }
Затем я вызываю это в отдельной функции, например:
private DataTable GetExtractData() { ......................... DataTable includeLastModified = new DataTable(); DataTable includeFunction = new DataTable(); DataTable includeDiscipline = new DataTable(); CloneTable(itemsTable, includeLastModified, lastModifiedTable, "LastModifiedDate", "LastModifiedDate"); CloneTable(includeLastModified, includeFunction, customPropertiesTable, "Function", "ItemTitle", true, "Title", "Function"); CloneTable(includeFunction, includeDiscipline, customPropertiesTable, "Discipline", "ItemTable", true, "Title", "Discipline"); return includeDiscipline; }
Проблема, с которой я сталкиваюсь, заключается в том, что данные здесь возвращаются пустыми, и я не уверен, почему. В моей функции CloneTable я сделал следующее, чтобы убедиться, что новая таблица не пуста:
foreach (DataRow row in newTable.Rows) { foreach (var item in row.ItemArray) { Console.WriteLine(item); } }
Он не пуст, поэтому я не уверен, почему, когда я возвращаю его в отдельной функции, он теперь пуст?
Я вызываю то же самое, но для таблицы includeDiscipline в функции getData, но она возвращается пустой.
Ошибок нет, но появляется и исчезает сообщение о том, что параметр «NewTable» может быть удален, так как начальное значение не используется. Я не уверен, как это может быть, хотя, поскольку это явно используется?
Я предполагаю, что, вероятно, именно так я вызываю функцию, но я действительно не уверен, что я сделал здесь неправильно
Ответ №1:
Ладно, момент с ладонью на лице, просто понял, что забыл кое — чему ее присвоить.
Так что, если я сделаю что-то вроде:
var test = CloneTable(itemsTable, includeLastModified, lastModifiedTable, "LastModifiedDate", "LastModifiedDate"); return test;
Он отлично работает и больше не возвращается пустым