LINQ创建嵌套对象的通用列表

时间:2018-09-16 05:24:47

标签: c# .net list linq generics

如何从另一个List<Type1>获得一个包含另一个List<Type2>的{​​{1}}?

这里是情况:

我有一个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

我在LINQ上尝试过,这是我得到的成果:

Table

我的解决方案存在的问题是,我的查询不是通用列表...

有人能指出我正确的方向吗? LINW在这里正确的方法吗?如果是,我如何获得想要的结果?

预先感谢

2 个答案:

答案 0 :(得分:1)

  1. 前言:我更喜欢(并建议)使用具有扩展方法语法的Linq而不是使用fromgroupinto关键字,因为它更具表达力,并且如果需要您仍然需要使用扩展方法来执行更高级的Linq操作。
  2. 首先,您的输入是非规范化的(我假设运行SELECT ... FROM INFORMATION_SCHEMA.COLUMNS的输出),其中每一行都包含重复的表信息,因此请使用GroupBy将行按表标识符分组(don别忘了同时使用表架构表名来唯一标识一个表!)
  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()

答案 1 :(得分:0)

好的,我自己找到答案。

这里是:

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()
             });