Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅当新值与当前值不同时才更新属性_C#_.net_Sitecore - Fatal编程技术网

C# 仅当新值与当前值不同时才更新属性

C# 仅当新值与当前值不同时才更新属性,c#,.net,sitecore,C#,.net,Sitecore,我有这样一种情况:我在一夜之间更新CMS(Sitecore)中的大量内容,在这种情况下,我必须迭代大量数据,但只应用少量更新(大约320000个潜在字段,估计可能有3000个字段的值实际发生了变化)。我希望简化此过程,以便仅当新值与当前值不同时才进行更新。通过这种方式,我希望最大限度地减少更新后发生的重新编制索引的数量,同时也最大限度地减少随后发布的内容数量 这是我现在正在做的一个例子 langItem.Fields["Type"].Value = updateNode.SelectSingle

我有这样一种情况:我在一夜之间更新CMS(Sitecore)中的大量内容,在这种情况下,我必须迭代大量数据,但只应用少量更新(大约320000个潜在字段,估计可能有3000个字段的值实际发生了变化)。我希望简化此过程,以便仅当新值与当前值不同时才进行更新。通过这种方式,我希望最大限度地减少更新后发生的重新编制索引的数量,同时也最大限度地减少随后发布的内容数量

这是我现在正在做的一个例子

langItem.Fields["Type"].Value = updateNode.SelectSingleNode("./Type").InnerText;
这就是我想把它改成的

if (langItem.Fields["Type"].Value != updateNode.SelectSingleNode("./Type").InnerText)
    langItem.Fields["Type"].Value = updateNode.SelectSingleNode("./Type").InnerText;
我觉得应该有某种操作员为我处理这件事。我认为没有,但如果有,请告诉我是什么。有很多XPath查询(我所有的数据都是XML),我觉得重复这些查询是浪费,但为所有这些查询创建变量似乎也是一种糟糕的形式。此外,还有一些示例,其中右侧涉及方法调用。我认为在这些情况下,为结果创建一个变量是有意义的


还有哪些其他优化方法?

一个简单的方法怎么样,例如:

protected void UpdateIfChanged(Field field, string value)
{
    if (field.Value != value)
    {
        field.Value = value;
    }
}

UpdateIfChanged(langItem.Fields["Type"], updateNode.SelectSingleNode("./Type").InnerText);
(以上代码未经测试)

如果愿意,也可以将其作为扩展方法添加到Field类中


但是,不确定这实际上为您节省了多少性能。如果没有字段更改,您确实需要避免保存项目,对吗?可以通过从方法返回bool来实现这一点,如果任何字段返回true,您就知道如何保存该项。

我唯一能想到的可能是使用Sitecore查询语法来尝试选择有差异的项

例如(假设updateNode具有与lang项相同的ID属性)


基本上,你只会得到一个具有不同价值的物品的点击。我不确定你的数据是如何排列的,所以也许你可以以某种方式调整查询,但这可能会加快速度(如果没有命中,不需要用数据填充

没有办法暂停重新索引?@GertArnold我已经暂停重新索引了,但一旦对数据进行了更改,就会进行索引。也就是说,您可以将重新索引延迟到所有更新完成之后,以加快更新过程,但数据需要在某个时间点进行索引。很好,但我所拥有的字段和项目的组合使此不可行。我将此作为最接近的答案。我使用了你的方法,不是很有创意,但在我发布我的问题之前我并没有想到,所以我不能抱怨。当我调用它时,我将它与三元if-then?:操作符结合起来,以减少代码行数。通过按日期过滤,减少可能的数据更改,我确实得到了一些选择。我觉得这并不能真正让我达到我需要的地方,但在我有时间重新编写代码之前,我希望它能起作用。
var id = updateNode.SelectSingleNode("./Id").InnerText;
var val = updateNode.SelectSingleNode("./Type").InnerText;
var query = rootPathOfItems + "//*[@@id='{" + id + "} and @Type!='" + val + "']";
var item = Sitecore.Context.Database.SelectSingleItem(query);
if (item != null) {
    item.Editing.BeginEdit();
    item.Fields["Type"].Value = val;
    item.Editing.EndEdit();
}