Как выбрать все столбцы в соединении LINQ Datatable?

2
var collection = from t1 in dt1.AsEnumerable()
                 join t2 in dt2.AsEnumerable()
                 on t1["id"] equals t2["id"]
                 select new { Name = t1["name"], Group = t2["group"] };

Я хочу выбрать все столбцы обеих таблиц, например, присоединиться к SQL Server.

В дополнение Как я могу преобразовать весь результат обеих таблиц в таблицу данных?

  • 0
    Вы можете перечислить все нужные вам свойства из 2 таблиц в select new {...}
Теги:
linq

3 ответа

4
var collection = from t1 in dt1.AsEnumerable()
             join t2 in dt2.AsEnumerable()
             on t1["id"] equals t2["id"]
             select new { T1 = t1, T2 = t2 };

затем...

РЕДАКТИРОВАТЬ:

Что-то в этом роде

//clone dt1, copies all the columns to newTable 
DataTable newTable = dt1.Clone();

//copies all the columns from dt2 to newTable 
foreach(var c in dt2.Columns)
    newTable.Columns.Add(c);

//now newTable has all the columns from the original tables combined

//iterates over collection
foreach (var item in collection) {
    //creates newRow from newTable
    DataRow newRow = newTable.NewRow();
    //iterate the columns, gets values from either original table if column name is there
    foreach(var c in newTable.Columns)
        newRow[c.ColumnName] = item.T1.ContainsColumn(c.ColumnName) ?  item.T1[c.ColumnName] : item.T2[c.ColumnName];
    newTable.Rows.Add(newRow);
}

Это сработает. Но если dt1 и dt2 имеют несколько столбцов с одним и тем же именем, у вас может быть некоторая потеря данных.

  • 0
    Вот как я смогу получить доступ к строке один за другим. :( Я хочу преобразовать результат в таблицу данных. Как я могу преобразовать весь результат обеих таблиц в таблицу данных?
  • 0
    Фрагмент готов. Я настоятельно рекомендую вам использовать менее автоматизированную версию (вручную присваивая имена каждому столбцу из внутреннего объединения). Как я упоминал в ответе, если dt1 и dt2 имеют столбцы с одинаковым именем, он получит значение только одного из них (dt1), а не другого.
1

Хотя вы не можете расширять их до столбцов, вы можете просто вернуть объекты. Например:

select new { CTLJCRJOB, CTLRFDSTM }

Если вам нужно, чтобы он был сплющен, вам придется самим написать картографию, но все равно будет очень тривиально.

Ссылка из:

Выделить все столбцы для всех таблиц в join + linq join

ou должны указывать каждый вручную, если вы хотите проецировать в сплющенный тип. Другой вариант состоит в том, чтобы только ваш комбинированный тип содержал оба объекта, и объекты, естественно, принесли бы их свойства.

select new 
{
    Object1 = object1,
    Object2 = output
};

И вы будете работать с ним, как myObj.Object1.Property1, myObj.Object2.Property4 и т.д.

Один из последних вариантов, который по-прежнему связан с ручной работой, заключается в определении соответствующего типа и использовании конструктора или метода построения, который выполняет работу по сегментированию свойств объекта в сплющенный тип. Вы по-прежнему выполняете ручное сопоставление, но вы изолируете его от логики запроса.

select new CombinedType(object1, output);
//or 
select builder.GetCombinedType(object1, output);

Ссылка от

Выберите все столбцы после JOIN в LINQ

  • 0
    Вы никогда не должны публиковать ответ только по ссылке, так как он будет недействительным, если вставленный здесь URL не работает. Отослать это
  • 0
    Спасибо за указание на мою ошибку, я никогда не знал, что такой протокол существует. Я отредактирую свой ответ, даже если @DesertFox уже дал ответ.
0
var collection = (from t1 in dt1.AsEnumerable()
                 join t2 in dt2.AsEnumerable()
                 on t1  ["id"] equals t2  ["id"]
                 select new { Name = t1  ["name"], Group = t2  ["group"] }).ToList() ;

Надеюсь, это поможет

  • 0
    Моя таблица содержит 62 столбца. Как я могу указать столбцы как этот один за другим? имя, группа и т. д.
  • 0
    Если вы можете лучше получить данные, используя и SP или базовый запрос, а затем манипулировать ими как объектом. Я не думаю, что это хорошая идея, чтобы получить все 62 столбца в запросе linq

Ещё вопросы

Сообщество Overcoder
Наверх
Меню