LINQ создает общий список объектов Nestet

Как я могу получить List<Type1>, который включает в себя другой List<Type2>, от другого List<Type3>?

Вот такая ситуация:

У меня List<DbStruncture>. Каждая запись включает DatabaseStructure

public partial class DatabaseStructure
{
    public string TableSchema { get; set; }
    public string TableName { get; set; }
    public string ColumnName { get; set; }
    public bool? IsPrimaryKey { get; set; }
}

у меня тоже есть

public class Table
{
    public string Name { get; set; }
    public string Schema { get; set; }
    public List<Column> Columns { get; set; }
}

public class Column
{
    public string Name { get; set; }
    public bool? IsPrimaryKey { get; set; }
}

Теперь я хочу заполнить данные из List<DatabaseStructure> в List<Table>, который включает в себя List<Column> со всеми Columns этого Table.

Я пробовал это с LINQ, и вот как далеко я зашел:

var query =
            from t in result
            group t.TableName by t.TableName
            into tn
            select new
            {
                Table = tn.Key,
                Schema = from s in result where s.TableName == tn.Key select s.TableSchema.First(),
                Columns = from c in result where c.TableName == tn.Key select new Column
                {
                    Name = c.ColumnName,
                    IsPrimaryKey = c.IsPrimaryKey
                }
            };

Проблема с моим решением в том, что мой запрос не является общим списком ...

Может ли кто-нибудь указать мне правильное направление? Подходит ли LINW здесь? Если да, как мне получить желаемый результат?

заранее спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
56
2

Ответы 2

  1. Предисловие: Я предпочитаю (и рекомендую) использовать Linq с синтаксисом метода расширения вместо использования ключевых слов from, group, into, потому что это более выразительно, и если вам нужно выполнять более сложные операции Linq, вам все равно придется использовать методы расширения.
  2. Начнем с того, что ваш ввод денормализован (я предполагаю, что вывод запущен SELECT ... FROM INFORMATION_SCHEMA.COLUMNS), где каждая строка содержит повторяющуюся информацию о таблице, поэтому используйте GroupBy для группировки строк вместе по их идентификатору таблицы (не забудьте использовать обе схемы таблицы а также Table Имя для однозначной идентификации таблицы!)
  3. Затем преобразуйте каждую группу (IGrouping<TKey: (TableSchema,TableName), TElement: DatabaseStructure>) в объект Table.
  4. Затем заполните список Table.Columns, выполнив внутренний Select из группы IGrouping, а затем .ToList(), чтобы получить конкретный объект List<Column>.

Мое выражение:

List<DatabaseStructure> input = ...

List<Table> tables = input
    .GroupBy( dbs => new { dbs.TableSchema, dbs.TableName } )
    .Select( grp => new Table()
    {
        Name = grp.Key.TableName,
        Schema = grp.Key.TableSchema,
        Columns = grp
            .Select( col => new Column()
            {
                Name = col.Name,
                IsPrimaryKey = col.IsPrimaryKey
            } )
            .ToList()
    } )
    .ToList()

Хорошо, только что нашел ответ сам.

Вот:

var query =
            (from t in result
             group t.TableName by t.TableName
            into tn
             select new Table
             {
                 Name = tn.Key,
                 Schema = (from s in result where s.TableName == tn.Key select s.TableSchema).First(),
                 Columns = (from c in result
                            where c.TableName == tn.Key
                            select new Column
                            {
                                Name = c.ColumnName,
                                IsPrimaryKey = c.IsPrimaryKey
                            }).ToList()
             });

Другие вопросы по теме