“命令”;超时“;在Sitecore自动创建项目期间
我有一个命令,已添加到Sitecore编辑器中的“国家”节点。该命令生成其下50个状态节点的列表。然后,它遍历状态节点(一次1个),并在每个状态节点下生成本地节点列表。在本地节点列表中,我遍历它们并检查新项是否存在——如果不存在,我将其添加(创建)为本地节点下的子项。最终,在执行此命令的过程中,将添加近300个本地项 有没有更有效的方法来实现这一点(快速查询将300个本地节点放入一个列表,然后检查该项是否存在并创建它)?如果是这样,我不知道怎么做 我不确定这次行动最昂贵的部分是什么。最终,我仍在执行多达300个单独的查询来检查它是否在那里,然后是insert语句,所以这可能仍然需要一段时间才能运行。如果是,web配置中的哪个设置将增加Sitecore中适用的“超时”设置?示例结构如下所示:“命令”;超时“;在Sitecore自动创建项目期间,sitecore,Sitecore,我有一个命令,已添加到Sitecore编辑器中的“国家”节点。该命令生成其下50个状态节点的列表。然后,它遍历状态节点(一次1个),并在每个状态节点下生成本地节点列表。在本地节点列表中,我遍历它们并检查新项是否存在——如果不存在,我将其添加(创建)为本地节点下的子项。最终,在执行此命令的过程中,将添加近300个本地项 有没有更有效的方法来实现这一点(快速查询将300个本地节点放入一个列表,然后检查该项是否存在并创建它)?如果是这样,我不知道怎么做 我不确定这次行动最昂贵的部分是什么。最终,我仍在
//Derive the template from the name of the item (page) that was passed in - this assumes that the template name and the item name are the same
Sitecore.Data.Database database = Sitecore.Data.Database.GetDatabase("master");
TemplateItem contentPageTemplate = database.SelectSingleItem("fast:/sitecore/Templates/User Defined/Home/Pages/Local Site/" + newPage);
Sitecore.Data.Items.Item[] stateNodes = null;
Sitecore.Data.Items.Item[] localNodes = null;
Item localHomePage = null;
Item newLocalPage = null;
int webBusinessID = 0;
string ID = "";
WebBusiness business;
//Get all of the immediate child nodes (state pages) under the "parent" node ("National Locations") - and put them into a list or array
stateNodes = database.SelectItems("fast:/sitecore/content/Home/National Locations/*");
for (int i = 0; i < stateNodes.Length; i++)
{
if (stateNodes[i].Children.Count > 0)
{
localNodes = database.SelectItems("fast:/sitecore/content/Home/National Locations/" + stateNodes[i].Fields["State Abbreviation"].ToString() + "/*");
}
else
{
//Do nothing
}
for (int j = 0; j < localNodes.Length; j++)
{
localHomePage = localNodes[j];
if (localHomePage.Publishing.IsPublishable(DateTime.Now, false) == true)
{
//If the new page does not exist, create it
if (localHomePage.Children[newPage] == null)
{
newLocalPage = localHomePage.Add(newPage, contentPageTemplate);
counter = counter + 1;
}
else
{
//Additional business logic
}
}
}
}
//从传入的项(页)的名称派生模板-这假定模板名称和项名称相同
Sitecore.Data.Database Database=Sitecore.Data.Database.GetDatabase(“master”);
TemplateItem contentPageTemplate=数据库。选择SingleItem(“fast:/sitecore/Templates/User Defined/Home/Pages/Local Site/”+newPage);
Sitecore.Data.Items.Item[]stateNodes=null;
Sitecore.Data.Items.Item[]localNodes=null;
项目localHomePage=null;
Item newLocalPage=null;
int webBusinessID=0;
字符串ID=“”;
网络商务;
//获取“父”节点(“国家位置”)下的所有直接子节点(状态页),并将它们放入列表或数组中
stateNodes=database.SelectItems(“fast:/sitecore/content/Home/National Locations/*”;
for(int i=0;i0)
{
localNodes=database.SelectItems(“fast:/sitecore/content/Home/National Locations/”+stateNodes[i]。字段[“州缩写”]。ToString()+“/*”;
}
其他的
{
//无所事事
}
对于(int j=0;j
除非我缺少您没有的逻辑/代码,否则我认为您可以简单地将其缩减为一个查询,通过更改XPath到达本地节点:
localNodes = database.SelectItems("fast:/sitecore/content/Home/National Locations/*/*");
更改是获取“国家位置”的直接子项的所有直接子项。如果您发布示例代码,从代码的角度显示您正在做的事情,将更容易帮助您改进它。这是一段相当多的代码。基本上,它只构建一个包含50个项目(代表50个州)的通用列表。然后,它遍历列表中的50个项目,并为每个状态创建另一个项目列表(用于本地节点)。然后它遍历本地节点列表(一次一个状态),首先检查该项是否存在,然后创建它(如果不存在)。代码是有效的,它只是在操作过程中超时,因为完成任务需要很长时间。因此,需要明确的是:您(1)创建50个
项
s,(2)在新创建的50个项
s上循环,并使用空检查创建X多个子项
s?你可以用一个显示结构的样本树来更新这个问题吗?不完全可以,马克。上面已经添加了示例代码。这就是我想要弄明白的。这将有助于显著减少迭代次数。我将对此进行一次尝试,看看它在向Sitecore DB添加300个项目时是否继续超时。您可能希望使用(new BulkUpdateContext()){…}将项目创建循环包装在中,以进一步加快速度。如果这提高了速度并回答了您的问题,不要忘记将其标记为答案。这实际上允许操作完成,而不会超时。谢谢你的建议。太好了,点击答案左边的复选标记将其标记为答案。您还需要对其他一些问题执行此操作。另一个改进是在运行添加新项的循环时禁用索引。要禁用索引,只需添加以下行:Sitecore.Configuration.Settings.indexing.Enabled=false;只是别忘了再打开它。