“命令”;超时“;在Sitecore自动创建项目期间

“命令”;超时“;在Sitecore自动创建项目期间,sitecore,Sitecore,我有一个命令,已添加到Sitecore编辑器中的“国家”节点。该命令生成其下50个状态节点的列表。然后,它遍历状态节点(一次1个),并在每个状态节点下生成本地节点列表。在本地节点列表中,我遍历它们并检查新项是否存在——如果不存在,我将其添加(创建)为本地节点下的子项。最终,在执行此命令的过程中,将添加近300个本地项 有没有更有效的方法来实现这一点(快速查询将300个本地节点放入一个列表,然后检查该项是否存在并创建它)?如果是这样,我不知道怎么做 我不确定这次行动最昂贵的部分是什么。最终,我仍在

我有一个命令,已添加到Sitecore编辑器中的“国家”节点。该命令生成其下50个状态节点的列表。然后,它遍历状态节点(一次1个),并在每个状态节点下生成本地节点列表。在本地节点列表中,我遍历它们并检查新项是否存在——如果不存在,我将其添加(创建)为本地节点下的子项。最终,在执行此命令的过程中,将添加近300个本地项

有没有更有效的方法来实现这一点(快速查询将300个本地节点放入一个列表,然后检查该项是否存在并创建它)?如果是这样,我不知道怎么做

我不确定这次行动最昂贵的部分是什么。最终,我仍在执行多达300个单独的查询来检查它是否在那里,然后是insert语句,所以这可能仍然需要一段时间才能运行。如果是,web配置中的哪个设置将增加Sitecore中适用的“超时”设置?示例结构如下所示:

//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;只是别忘了再打开它。