Моя цель: linq-объединить два c # DataTables и выбрать все столбцы из первой таблицы (без нумерации столбцов) и только 1 столбец из второй и получить результат в виде DataTable:
var result = from t in tt.AsEnumerable() join a in aa.AsEnumerable() on t.Field<DateTime>("time") equals a.Field<DateTime>("time")
select new { t, aa_col1 = a.Field<int>("col1") }
;
ДА, результат этого объединения не может быть преобразован в DataTable.
Основная идея проблемы заключается в : не перечислять все столбцы tt вручную, покасоставление linq-join (число столбцов tt может быть большим и динамичным)
Я пытался решить проблему с помощью метода result.CopyToDataTable (), но ошибка компилятора: Type <система анонимного типа.Data.DataRow t, int aa_col1> нельзя использовать в качестве параметра типа T в универсальном методе «DataTableExtensions.CopyToDataTable (IEnumerable)» *
Ниже показан код для тестовых таблиц tt иaa:
DataTable tt = new DataTable();
tt.Columns.Add("time", typeof(DateTime));
tt.Columns.Add("col1", typeof(int));
tt.Columns.Add("col2", typeof(int));
tt.Columns.Add("col3", typeof(int));
DataRow dr = tt.NewRow();
dr["time"] = new DateTime(2018,10,5); dr["col1"] = 24; dr["col2"] = 14; dr["col3"] = 15;
tt.Rows.Add(dr);
dr = tt.NewRow();
dr["time"] = new DateTime(2018, 10, 6); dr["col1"] = 4; dr["col2"] = 43; dr["col3"] = 58;
tt.Rows.Add(dr);
dr = tt.NewRow();
dr["time"] = new DateTime(2018, 10, 6); dr["col1"] = 6; dr["col2"] = 3; dr["col3"] = 78;
tt.Rows.Add(dr);
dr = tt.NewRow();
dr["time"] = new DateTime(2018, 10, 7); dr["col1"] = 1; dr["col2"] = 4; dr["col3"] = 5;
tt.Rows.Add(dr);
// -----
DataTable aa = new DataTable();
aa.Columns.Add("time", typeof(DateTime));
aa.Columns.Add("col1", typeof(int));
aa.Columns.Add("col2", typeof(int));
aa.Columns.Add("col3", typeof(int));
DataRow rr = aa.NewRow();
rr["time"] = new DateTime(2018, 10, 4);
rr["col1"] = 6; rr["col2"] = 34; rr["col3"] = 66;
aa.Rows.Add(rr);
rr = aa.NewRow();
rr["time"] = new DateTime(2018, 10, 5); rr["col1"] = 7; rr["col2"] = 43; rr["col3"] = 98;
aa.Rows.Add(rr);
rr = aa.NewRow();
rr["time"] = new DateTime(2018, 10, 6); rr["col1"] = 6; rr["col2"] = 3; rr["col3"] = 3;
aa.Rows.Add(rr);
rr = aa.NewRow();
rr["time"] = new DateTime(2018, 10, 7); rr["col1"] = 16; rr["col2"] = 65; rr["col3"] = 12;
aa.Rows.Add(rr);
Linq-join создает тип: {System.Linq.Enumerable.d__38f__AnonymousType0>}
См. рисунки, показывающие "var result "в деталях:
https://yadi.sk/i/X8K9HIq5hnavCg
и https://yadi.sk/i/MaViq23zqpRDXw
и https://yadi.sk/i/Re0DFJdVl02RjA
Целевым результатом объединения должна быть таблица, содержащая все столбцы из tt и первого столбца aa - aa.col1:
time col1 col2 col3 aa_col1
05.10.2018 0:00 24 14 15 7
06.10.2018 0:00 4 43 58 6
06.10.2018 0:00 6 3 78 6
07.10.2018 0:00 1 4 5 16