【问题标题】:how can I 'walk' the relationships between tables in LINQ?如何在 LINQ 中“遍历”表之间的关系?
【发布时间】:2010-12-07 19:39:11
【问题描述】:

假设我有三个表:

Office
 ID 

SalespeopleOffice 
 ID 
 OfficeID
 PersonID

People 
 ID 
 ManagerID 

在 LINQ to SQL 中,我如何从 SalespeopleOffices 表开始并通过表之间的关系从该表“步行”到 People 表或 Office 表?特别是在不知道这些关系是什么的情况下;提取有关关系的数据,而不是直接与对象交互。我正在寻找一种以编程方式分析表关系的方法。我正在使用的数据库有比这更多的表,所以实际上它比这复杂得多。

理想情况下,我希望创建一个 LinqPad 脚本来执行此操作。

【问题讨论】:

    标签: linq linq-to-sql linqpad


    【解决方案1】:

    您可以使用反射来检查上下文中每种类型的属性。 (在 LinqPad 中,上下文是 this)。

    • 值和字符串属性将是表上的标量字段,
    • EntitySet 属性将表示 [something]-to-many 关系,并且
    • 其他类型将是 [something]-to-one 关系。

    如果您将关系的两个方面联系起来,您就可以弄清楚每种情况下的 [某事] 是什么。这有意义吗?

    编辑

    我只是随便看看,还有更好的方法。模型信息可通过 Mapping 属性获得。试试这个:

    var tableData = from t in this.Mapping.GetTables()
                    select new 
                    {
                        t.TableName,
                        Associations = 
                            from a in t.RowType.Associations
                            select new
                        {
                            a.ThisMember.Name,
                            TypeName = a.ThisMember.Type.Name
                        }
                    };
    tableData.Dump();
    

    假设您已激活自动完成功能,通过探索此元数据的属性找到您感兴趣的确切数据应该是小菜一碟。

    【讨论】:

    • 是的,我认为这是正确的方向。如果我让它工作,将发布代码。
    【解决方案2】:

    如果您使用 LINQ to SQL,您的 SalespeopleOffices 实例应该具有 People 和 Office 属性。

    类似:

    var salesPO = dataContext.SalespeopleOffices.First()
    var office = salesPO.Office 
    var man = salesPO.People
    

    【讨论】:

    • 不是我想要的。提前知道他们的名字,如何找到这些关系?我需要将它从对象级别抽象出来才能遍历树。
    • 即如何获取所有具有指向 People 表的外键的表的列表?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2015-05-21
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多