2010-12-07 94 views
4

比方说,我有三个表:我该如何“走”LINQ中表格之间的关系?

Office 
ID 

SalespeopleOffice 
ID 
OfficeID 
PersonID 

People 
ID 
ManagerID 

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

我最好想创建一个LinqPad脚本来做到这一点。

回答

5

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

  • 价值和字符串属性会在桌子上标量场,
  • EntitySet的属性将代表[某件事]一对多的关系,并
  • 其他类型将是[东西] -to-一个关系。

如果你连接关系的两面,你可以找出每件事情[什么]。那有意义吗?

编辑

我只是闲逛了一下,有一个更好的办法。模型信息可通过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(); 

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

1

如果您使用的是LINQ to SQL,那么您的SalespeopleOffices实例必须具有人员和Office属性。

喜欢的东西:

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

不是我真正想要的。我怎么能提前知道这些关系的名称?我需要将它从对象级别抽象出来以便能够遍历树。 – jcollum 2010-12-07 21:05:06

+0

即我如何获得所有具有指向People表的外键的表的列表? – jcollum 2010-12-07 21:09:49