LINQ选择新列表,将父类传递给属性类

本文关键字:父类 属性 新列表 选择 列表 LINQ | 更新日期: 2023-09-27 18:13:39

我不确定我是否只是在搜索错误的东西,我只是找不到将父类传递到该类属性的示例。

我试图创建一个简单的例子,你可以在下面看到或在https://dotnetfiddle.net/uBGWgp上查看它。

我只是想让Column类知道它自己的父表,通过构造函数(new Table())传递它的实例。请参阅代码示例中的注释,我希望这样做:/*在这里传递父级?*/

using System;
using System.Collections.Generic;
using System.Linq;

public class FakeDb{
    public class FakeColumn{
        public string ColumnName;
    }
    public class FakeTable{     
        public string TableName {get;set;}
        public IEnumerable<FakeColumn> Columns {get;set;}
    }
    public IEnumerable<FakeTable> Tables {get;set;}
    public FakeDb(){
        Tables = new List<FakeTable>(){
            new FakeTable(){
                TableName = "People",
                Columns = new List<FakeColumn>(){
                    new FakeColumn(){
                        ColumnName = "FirstName"    
                    },
                    new FakeColumn(){
                        ColumnName = "LastName" 
                    }
                }
            }
        };
    }
}
public class Table{
    public Guid TableGuid = Guid.NewGuid();
    public IEnumerable<Column> Columns;
}
public class Column{
    private Table _myTable;
    public Guid ColumneGuid = Guid.NewGuid();
    public Column(Table hostTable){
        _myTable = hostTable;
    }   
}
public class Program
{
    public static void Main()
    {
        var fakeDb = new FakeDb();
        var tableList = fakeDb.Tables.GroupBy(p => p.TableName, p => p, (tableName, values) => new {
            TableName = tableName,
            OtherValues = values
        }).Select(p => new Table(){
            Columns = p.OtherValues.Select(i => new Column(/* Pass parent here? */)).ToList()
        }).ToList();

    }
}

LINQ选择新列表,将父类传递给属性类

因为您没有保存对正在创建的新Table对象的引用,因此无法在单行查询中执行此操作。然而,将其更改为多行lambda表达式将使这成为可能。将新创建的表保存在一个变量中,然后将该变量传递给Column的构造函数。

你必须这样做

.Select(p => 
{
    var t = new Table();
    t.Columns = p.OtherValues.Select(i => new Column(t)).ToList();
    return t;
});

演示:https://dotnetfiddle.net/1kKxMR