值不在预期范围内 - SharePoint查找字段的例外

时间:2017-02-09 10:36:25

标签: sharepoint sharepoint-2013 csom

我正在尝试将数据从一个列表复制到其他列表(两个列表都在不同的站点上)以及查找列。但是,我收到查询字段的错误:

  

价值不在预期范围内

代码工作和数据被复制用于其他非查找字段。我尝试了一切可能的方法,包括增加列表视图查找阈值和所有可能的代码方式,但仍然在ExecuteQuery()仍然存在错误。

以下是我的查找字段代码:

if (field is FieldLookup && field.InternalName == "Country")
{
    var CountryLookup = (item.FieldValues["Country"] as FieldLookupValue).LookupValue.ToString();
    var CountryLookupId = (item.FieldValues["Country"] as FieldLookupValue).LookupId.ToString();
    FieldLookupValue flvRDS = new FieldLookupValue();
    flvRDS.LookupId = int.Parse(CountryLookupId);
    itemToCreate["Country"] = flvRDS;
    itemToCreate.Update();
    destContext.ExecuteQuery();
}

非常感谢帮助。

1 个答案:

答案 0 :(得分:0)

我认为item是您尝试在目标列表上创建的新ListItem。

但你实际上从来没有从field读取任何价值!所以基本上,你正在尝试使用项目[“Country”]设置新的FieldLookup.LookupId。LookupId,此时逻辑上应为空。

这是我用来从值中检索查找字段ListItem的方法,随意修改它以满足您的需要,因为我不知道您想如何检索它(SPList是Microsoft.SharePoint的别名。 Client.List)。

private ListItem GetLookupItem(FieldLookup lookupField, string lookupValue)
{
    string mappingField = lookupField.LookupField;

    Microsoft.SharePoint.Client.List lookupList = Context.Web.Lists.GetById(new Guid(lookupField.LookupList));

    Context.Load(lookupList);
    Context.ExecuteQuery();

    ListItemCollection libListItems = lookupList.GetItems(CamlQuery.CreateAllItemsQuery());
    Context.Load(libListItems, items => items.Include(
        itemlookup => itemlookup.Id,
        itemlookup => itemlookup[mappingField]));
    Context.ExecuteQuery();

    foreach (ListItem mappedItem in libListItems)
    {
        object mappedField = mappedItem[mappingField];
        if (mappedField != null && mappedField.ToString().Equals(lookupValue))
            return mappedItem;
    }

    return null;
}

现在您已拥有相应的ListItem,您可以将item.LookupId设置为其ID:

if (field is FieldLookup && field.InternalName == "Country")
{
    FieldLookupValue flvRDS = new FieldLookupValue();
    flvRDS.LookupId = GetLookupItem(field as FieldLookup, "France").Id; // here, dunno how you get your country's name
    itemToCreate["Country"] = flvRDS;
    itemToCreate.Update();
    destContext.ExecuteQuery();
}

如果您想要一个更适合您特定问题的答案,请随意添加更多以前的代码。