使用 C# 遍历 Enterprise Architect 中的包层次结构

Iterating through hierarchy of packages in Enterprise Architect using C#

我必须迭代并从 Enterprise Architect 收集最多 5 个级别的包。主根包中有各种这样的级别。到目前为止,我一直在使用如下递归方式:

public void GetAllPackages(EA.Package dumpPackage)
{
    foreach (EA.Package packages in dumpPackage.Packages)
    {
        //Save that package in object
        GetAllPackages(packages);
    }
}

但是现在由于数据较多,这个循环需要花费很多时间将近 1 分钟才能完成。有没有更快的方法来迭代和收集所有这些包。

您可以做的是通过

在单个查询中获取所有包裹
Repository.SQLQuery("SELECT package_id, parent_id FROM t_package")

现在将它们放在散列中,这样您就有了一棵树,其中引用了一个包的所有子项。也就是说,每个条目都会收到一个子包列表,因此您可以轻松地遍历此树以查找所需的任何包。

递归 SQL 是不可能的(至少在我知道的 SQL 方言中)。但是上面肯定会快得多,因为瓶颈是 EA 将在递归遍历期间发出的单个包的重复 SQLs。

选项 1 此解决方案要求您使用 SQL 查询生成器创建查询:

SELECT pkg.package_id FROM t_object o, t_package pkg
WHERE
  pkg.Package_id in (#Branch#)
  AND o.Package_ID = pkg.package_id
  AND o.Object_Type = 'Package'

现在您需要关注要递归的包,然后 运行 使用

进行搜索
Respository.GetElementsByQuery (<QueryName>, "")

其中 <QueryName> 是您的查询名称。

我不知道这将如何提高性能。 #Branch# 宏将在 EA 内部进行评估,我不知道这是如何完成的。希望它比脚本递归更快。只需手动尝试上面的查询,看看它是否足够快。

备选方案 2 您可以使用具有固定数量 JOIN 的 SQL 来深入多个级别,例如

t_object INNER JOIN t_package AS ObjectParent ON  t_object.package_id = ObjectParent.package_id)
LEFT JOIN t_package AS PackageParent1 ON (ObjectParent.Parent_ID = PackageParent1.package_id))
LEFT JOIN t_package AS PackageParent2 ON (PackageParent1.Parent_ID = PackageParent2.package_id))

但这相当依赖于 RDBMS,您必须自己尝试。