gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:36 26 4
gpt4 key购买 nike

我必须迭代并从 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 将在递归遍历期间发出的单个包的重复 SQL。

备选方案 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 s 潜入多个级别,例如

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,您必须自己尝试。

关于c# - 使用 C# 遍历 Enterprise Architect 中的包层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43198826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com