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

时间:2011-10-14 04:18:00

标签: c# .net sitecore

我有一种情况,我在一夜之间更新CMS(Sitecore)中的大量内容,我必须迭代大量数据,但只需要应用一些更新(大约320,000个潜在字段) ,并且猜测可能是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),我觉得重复它们是浪费,但为所有这些创建变量似乎也是糟糕的形式。此外,还有一些示例,右侧涉及方法调用。我认为在那些情况下为结果创建变量是有道理的。

有哪些优化此选项的其他选项?

2 个答案:

答案 0 :(得分:0)

仅仅是一种简单的方法,例如

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,你就知道保存该项。

答案 1 :(得分:0)

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

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

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();
}

基本上,您只会对具有不同值的项目进行点击。我不确定你的数据是如何布局的,所以也许你可以用某种方式调整查询,但这可能会加快一些速度(不需要用数据填写Item没有打击)