LINQ создать общий список объектов Nestet - PullRequest
0 голосов
/ 16 сентября 2018

Как я могу получить 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 правильный путь здесь? Если да, как я могу получить желаемый результат?

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

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

ОК, только что нашел ответ сам.

Вот оно:

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()
             });
0 голосов
/ 16 сентября 2018
  1. Предисловие: Я предпочитаю (и рекомендую) использовать Linq с синтаксисом метода расширения вместо использования ключевых слов from, group, into, потому что это более выразительно и если вам нужно сделать более продвинутый LinqВ любом случае, вам нужно будет использовать методы расширения.
  2. Для начала, ваш ввод денормализуется (я предполагаю, что выход выполняется SELECT ... FROM INFORMATION_SCHEMA.COLUMNS), где каждая строка содержит повторяющуюся информацию таблицы, поэтому используйте GroupBy длясгруппируйте строки вместе по их идентификатору таблицы (не забудьте использовать обе схемы таблицы и имя таблицы для уникальной идентификации таблицы!)
  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()
...