У меня есть вопрос о объединениях в LINQ. В настоящее время я конвертирую приложение доступа в .NET, где данные извлекаются из двух разных баз данных на двух разных серверах. В старом приложении данные можно было получить одним запросом:
SELECT *, tbl2.Descr, tbl2.Form FROM tbl2 RIGHT JOIN tbl1 ON tbl2.proId2 = tbl1.proId
Я обнаружил, что один из способов сделать это в .NET — получить две таблицы по отдельности, а затем соединить их с помощью LINQ. У меня нет опыта работы с LINQ, поэтому я могу ошибаться в своей логике или коде, потому что не могу заставить его работать.
Сначала я попытался сделать обычное соединение (без права), но затем возвращаются только 18 строк, когда две таблицы содержат почти 2000 строк. Я также проверил данные, и это определенно должно привести к большему количеству строк, пустых ячеек не так много. Итак, я собрал правое/левое соединение, но на самом деле это приводит к ошибке. Когда я отлаживаю его, все в порядке, когда выполняется инструкция LINQ, но когда я перехожу к foreach, отображается ошибка, и ошибка фактически указывается в инструкции linq, говоря, что таблица2 пуста. Когда я проверяю таблицу 1, я также вижу только 22 строки данных.
Что я делаю неправильно?
DataTable dtTarget= data1.Clone();
var dt2Columns = data2.Columns.OfType<DataColumn>().Select(dc =>
new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
where dtTarget.Columns.Contains(dc.ColumnName) == false
select dc;
dtTarget.Columns.AddRange(dt2FinalColumns.ToArray());
var results = from table1 in data1.AsEnumerable()
join table2 in data2.AsEnumerable()
on table1.Field<String>("proId") equals table2.Field<String>("proId2")
select table1.ItemArray.Concat(table2.ItemArray).ToArray();
foreach (object[] values in results)
dtTarget.Rows.Add(values);
Внешнее соединение:
var results = from table1 in data1.AsEnumerable()
join table2 in data2.AsEnumerable() on table1.Field<String>("proId") equals table2.Field<String>("proId2") into t_join
from table2 in t_join.DefaultIfEmpty(null) select table1.ItemArray.Concat(table2.ItemArray).ToArray();