Member 14760154 Ответов: 2

Как объединить две таблицы данных


У меня есть две таблицы данных ,которые я хочу объединить, и я бы отсортировал их.

Что я уже пробовал:

это мой код.

FileInfo existingFile = new FileInfo(@excelreport);
         using (ExcelPackage package = new ExcelPackage(existingFile))
         {
             ExcelWorksheet worksheet = package.Workbook.Worksheets[1];
             int colCount = worksheet.Dimension.End.Column;  //get Column Count
             int rowCount = worksheet.Dimension.End.Row;
             DataTable table = new DataTable();
             table.Columns.Add("Emp_fullname", typeof(string));
             table.Columns.Add("Emp_nik", typeof(string));
             table.Columns.Add("Timer_Finger", typeof(string));

                 for (int i=1; i<rowCount; i++)
                 {
                     table.Rows.Add(worksheet.Cells[i+1, 12].Value.ToString(), worksheet.Cells[i+1, 1].Value, worksheet.Cells[i+1, 4].Value.ToString());
                 }
                 string[] values1 = new string[table.Rows.Count];


                 var ordered = table.AsEnumerable().OrderByDescending(row => row["Timer_Finger"]);
                 foreach (DataRow row in ordered)
                 {
                     for (int i = 0; i < table.Rows.Count; i++)
                     {
                         values1[i] = table.Rows[i]["Emp_fullname"].ToString() + " " + table.Rows[i]["Emp_nik"].ToString() +  " " +table.Rows[i]["Timer_Finger"].ToString();
                     }
                 }
                 label11.Text = values1[values1.Length -1];

                 table.Clear();
         }
         DataTable table2 = new DataTable();
         DataSet dset2 = new DataSet();
         dset2 = FingerLog.GetDataTop5();
         table2 = dset2.Tables[0];
         var order = table2.AsEnumerable().OrderBy(row => row["Timer_finger"]);
         string[] arrray = new string[table2.Rows.Count];
         foreach (DataRow row in order)
         {
             arrray = table2.Rows.OfType<DataRow>().Select(k => k[0].ToString() + " " + k[1].ToString() + " " + k[2].ToString()).ToArray();
         }
         label23.Text = arrray[0];



Как я могу решить эту проблему?

Maciej Los

На каком условии?
Можете ли вы поделиться образцами данных?

Member 14760154

Это мои примерные данные
001600063 2020-04-14 10:54:45.147
001800081 2020-04-14 10:54:36.540
001800081 2020-04-14 10:54:10.440
001600063 2020-04-13 23:40:10.223
001800081 2020-04-13 11:33:57.000
это из базы данных sql server

это вторые данные
001800082 4/14/2020 11:01:52 утра
001600063 4/14/2020 11:02:01 утра
это из файла excel

на самом деле я хочу объединить обе данные и отсортировать их ,

Maciej Los

Есть ли какая-то логика в "конкатенации" данных? Вы хотите сказать, что хотите объединить их?

Member 14760154

да я делаю,

жаль, что я не могу их объединить,

Maciej Los

Пожалуйста, используйте виджет "ответить" (справа от Ника/логина), чтобы быть уверенным, что система сообщит участнику о вашем ответе.
Смотрите мой ответ.

2 Ответов

Рейтинг:
16

Maciej Los

Член 14760154 написал:
Это мои примерные данные
001600063 2020-04-14 10:54:45.147
001800081 2020-04-14 10:54:36.540
001800081 2020-04-14 10:54:10.440
001600063 2020-04-13 23:40:10.223
001800081 2020-04-13 11:33:57.000

это из базы данных sql server

это вторые данные
001800082 4/14/2020 11:01:52 AM
001600063 4/14/2020 11:02:01 AM

это из файла excel

на самом деле я хочу объединить обе данные и отсортировать их


Ну, все, что вам нужно сделать, это использовать Linq ;) смотрите:
//create new datatable to store data from table1 and table 2
DataTable finaldt = new DataTable();
finaldt.Columns.AddRange(new DataColumn[]
	{
		new DataColumn("SomeNumber", typeof(string)), //use proper field name and type!
		new DataColumn("SomeDate", typeof(DateTime)) //use proper field name and type!
	});

DataTable dt1 = ds1.Table[0]; //refer to proper dataset and its table
DataTable dt2 = ds2.Table[0];

finaldt = dt1.AsEnumerable()
		.Concat(dt2.AsEnumerable())
		.OrderBy(r=> r.Field<DateTime>("SomeDate"))  //use poper field name!
		.Select(r=> finaldt.LoadDataRow(r.ItemArray, false))
		.CopyToDataTable();


Для получения более подробной информации, пожалуйста, смотрите:
Перечислимый.Функция concat&ЛТ;метод&ГТ;(интерфейс IEnumerable&ЛТ;метод&ГТ;, интерфейс IEnumerable&ЛТ;метод&ГТ;) Способ (Система.По LINQ) | Майкрософт Документы[^]
Перечислимый.Метод OrderBy (System.Linq) | Microsoft Docs[^]
объект DataTable.Метод LoadDataRow (System.Data) | Microsoft Docs[^]
DataTableExtensions.Метод CopyToDataTable (System.Data) | Microsoft Docs[^]

Я работал над этим Помощью linqpad[^] скрипт:
DataTable dt1 = new DataTable();
dt1.Columns.AddRange(new DataColumn[]
	{
		new DataColumn("SomeNumber", typeof(string)),
		new DataColumn("SomeDate", typeof(DateTime))
	});
dt1.Rows.Add(new object[]{"001600063", DateTime.ParseExact("2020-04-14 10:54:45.147", "yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)});
dt1.Rows.Add(new object[]{"001800081", DateTime.ParseExact("2020-04-14 10:54:36.540", "yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)});
dt1.Rows.Add(new object[]{"001800081", DateTime.ParseExact("2020-04-14 10:54:10.440", "yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)});
dt1.Rows.Add(new object[]{"001600063", DateTime.ParseExact("2020-04-13 23:40:10.223", "yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)});
dt1.Rows.Add(new object[]{"001800081", DateTime.ParseExact("2020-04-13 11:33:57.000", "yyyy-MM-dd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture)});

DataTable dt2 = new DataTable();
dt2.Columns.AddRange(new DataColumn[]
	{
		new DataColumn("SomeNumber", typeof(string)),
		new DataColumn("SomeDate", typeof(DateTime))
	});
dt2.Rows.Add(new object[]{"001800082", DateTime.ParseExact("4/14/2020 11:01:52 AM", "M/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture)});
dt2.Rows.Add(new object[]{"001600063", DateTime.ParseExact("4/14/2020 11:02:01 AM", "M/dd/yyyy hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture)});

DataTable finaldt = new DataTable();
finaldt.Columns.AddRange(new DataColumn[]
	{
		new DataColumn("SomeNumber", typeof(string)),
		new DataColumn("SomeDate", typeof(DateTime))
	});

finaldt = dt1.AsEnumerable()
		.Concat(dt2.AsEnumerable())
		.OrderBy(r=> r.Field<DateTime>("SomeDate"))
		.Select(r=> finaldt.LoadDataRow(r.ItemArray, false))
		.CopyToDataTable();

finaldt.Dump();


Рейтинг:
1

OriginalGriff

Не зная, что происходит, чего вы не ожидали, или не происходит, что вы сделали - и вы забыли сказать нам об этом, - я вижу одну непосредственную проблему:

string[] arrray = new string[table2.Rows.Count];
foreach (DataRow row in order)
{
    arrray = table2.Rows.OfType<DataRow>().Select(k => k[0].ToString() + " " + k[1].ToString() + " " + k[2].ToString()).ToArray();
}
Каждый раз, когда вы проходите этот цикл, вы отбрасываете результаты предыдущей итерации вместо того, чтобы добавлять к ним новые данные. Ты даже не пользуешься им. row данные внутри цикла!

Это может быть причиной вашей проблемы, но поскольку у нас нет никакого доступа к вашим данным или какой-либо идеи, что вы заметили, что это неправильно, мы не можем действительно сказать...


Member 14760154

На самом деле моя проблема заключается в том ,что я хочу объединить данные из базы данных и данные из файла excel,
а потом я их рассортирую ,

я получаю данные из базы данных с помощью процедуры хранения ,
а данные из excel я получаю с помощью eppplus

OriginalGriff

И что же?
Где ты застрял?
А что вы пробовали? (Кроме приведенного выше кода)
Какая помощь вам нужна?