2017-02-09 21 views
2

Я пытаюсь скопировать данные из одного списка в другой список (оба списка находятся на разных сайтах) вместе с колонками поиска. Но, я получаю сообщение об ошибке для поиска поля как:Значение не входит в ожидаемый диапазон - Исключение для поля поиска SharePoint

Значение не попадает в ожидаемый диапазон

код работает и получает данные копируются на другие поля без поиска. Я старался изо всех сил, включая увеличение порогового значения Look View Lookup и всех возможных способов кода, но все же ошибка сохраняется на 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(); 
} 

Помощь очень ценится.

ответ

0

Я предполагаю, что item - это новый объект ListItem, который вы пытаетесь создать в своем целевом списке.

Но вы никогда не читаете какую-либо ценность от field здесь! Итак, в основном вы пытаетесь установить новый файл FieldLookup.LookupId с элементом [«Страна»]. LookupId, который должен логически быть пустым в данный момент.

Вот метод, который я использую для получения поля ListItem для поиска из значения, не стесняйтесь изменять его в соответствии с вашими потребностями, поскольку я не знаю, как вы хотите его получить (SPList - это псевдоним для Microsoft.SharePoint .Список клиентов).

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

Вы можете добавить больше предыдущего кода, если вы хотите получить ответ, больше подходит для конкретной проблемы ,

+0

Фактически элемент - это существующие данные в элементе списка, из которого я читаю, и itemToCreate - это новый элемент, где мне нужно его скопировать. Также я получаю название страны и идентификатор в CountryLookup & CountryLookupId соответственно. Просто дело в том, что они не копируются. – Pratik

+0

Попробуйте получить идентификатор искомого элемента вместо LookupId, как в моем коде. – Kilazur