首页 > 解决方案 > LINQ 创建嵌套对象的通用列表

问题描述

我怎样才能得到一个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; }
}

现在我想将 Data 中的数据填充List<DatabaseStructure>到 aList<Table>中,其中包含 aList<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 是正确的方法吗?如果是,我如何获得想要的结果?

提前致谢

标签: c#.netlistlinqgenerics

解决方案


  1. 前言:我更喜欢(并推荐)使用带有扩展方法语法的 Linq 而不是使用from, group,into关键字,因为它更具表现力,如果您需要执行更高级的 Linq 操作,无论如何您都需要使用扩展方法。
  2. 首先,您的输入是非规范化的(我假设 running 的输出SELECT ... FROM INFORMATION_SCHEMA.COLUMNS),其中每行包含重复的表信息,因此使用GroupBy它们的表标识符将行分组在一起(不要忘记同时使用表架构表名唯一标识一个表!)
  3. 然后将每个组 ( IGrouping<TKey: (TableSchema,TableName), TElement: DatabaseStructure>) 转换为一个Table对象。
  4. 然后通过从组Table.Columns中执行内部来填充列表,然后获取具体对象。SelectIGrouping.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()

推荐阅读