给定两个Salesforce表名,我想确定它们之间是否存在父/子关系,以及关系是否存在哪个表是父表。
我有这种方法适用于简单的情况,但它没有优化,因为在最坏的情况下我必须经历两个表的所有子关系。我也不相信这种方法可以处理所有情况。
private String getParent(String table1, String table2) throws Exception
{
DescribeSObjectResult[] describeSObjectResults =
pc.describeSObjects(new String[] {table1, table2});
// Child relationships of table1
for (ChildRelationship cr : describeSObjectResults[0].getChildRelationships())
{
// table1 has a child matching table2
if (table2.equalsIgnoreCase(cr.getChildSObject()))
{
return table1;
}
}
// Child relationships of table2
for (ChildRelationship cr : describeSObjectResults[1].getChildRelationships())
{
// table1 has a child matching table2
if (table1.equalsIgnoreCase(cr.getChildSObject()))
{
return table2;
}
}
throw new Exception("There is no parent/child relationship.");
}
有更好的方法吗?
答案 0 :(得分:1)
我不确定我会在这里改变什么。这很简单,清楚易懂。保持代码。
你只能描述一个对象 - 向下“向下”到子关系,通过检查所有字段并检查像getReferenceTo()
这样的fieldDescribe方法是否返回有意义的东西来“向上”。 / p>
但我不会这样做:
Case.OwnerId
可以指向User
或Queue
Event.WhoId
可以指向任何已勾选“允许活动”的对象Report.ParentId
可以指向Folder
,User
或Organization
如果你担心表现......这是外在的,对吗?不是Apex而是Java或者C#(这个throws Exception
位)。
您可以尝试在数据库中预先填充一些帮助程序表,然后引用此缓存数据。
您可以尝试为您的组织提供“Enterprise WSDL”的缓存副本,并且我确信扫描本地保存的XML比go&更快。每次都要问SF(你需要记住每隔一段时间拿一份新的副本)。您甚至可以将它组合起来,将“本地数据库作为从WSDL生成的缓存加上,如果找不到任何内容 - 然后进行昂贵的描述调用”......