2015-12-30 4 views
0

Я пытаюсь удалить элементы из myDestinationList, если они не существуют в mySourceList. Я пытаюсь получить этот метод в C#. Я настроил это так, потому что два списка находятся на разных серверах. Какие-либо предложения?Удаление элементов списка Sharepoint с одного сайта на другое программно

Также я мог бы назначить автора/редактора из исходного списка в поля Author/Editor в списке адресатов?

Обновление: список содержит более 2 тыс. Элементов, клиент может обновлять список один раз в день или один раз в неделю, это может различаться.

static void Main(string[] args) { 
 

 
     ClientContext context = new ClientContext(site2); 
 
     List mySourceList = context.Web.Lists.GetByTitle(ListName); 
 
     CamlQuery camlQuery = new CamlQuery(); 
 
     camlQuery.ViewXml = "<View></View>"; 
 
     ListItemCollection mySourceItemColl = mySourceList.GetItems(camlQuery); 
 
     context.Load(mySourceItemColl); 
 
     context.ExecuteQuery(); 
 
     SPSite myDestinationSite = new SPSite(site2); 
 
     SPWeb myDestinationWeb = myDestinationSite.OpenWeb(); 
 
     SPList myDestinationList = myDestinationWeb.Lists[ListName2]; 
 
     SPQuery myDestinationListQuery = new SPQuery(); 
 
     myDestinationListQuery.Query = "" + 
 
     "" + 
 
     "" + 
 
     "" + 
 
     ""; 
 
     SPListItemCollection myDestinationItemColl = myDestinationList.GetItems(myDestinationListQuery); 
 

 

 
     foreach(ListItem mySourceListItem in mySourceItemColl) { 
 

 
     foreach() { 
 
//delete items 
 
      item.Delete(); 
 

 
     } 
 

 

 
     foreach(SPListItem myDestinationListItem in myDestinationItemColl) { 
 
//Update items here 
 
} 
 

 

 

 
     } 
 

 
    }

Event Receiver

 public override void ItemAdded(SPItemEventProperties properties) { 
 
      using(ClientContext context = new ClientContext(site1)) { 
 
       List list = context.Web.Lists.GetByTitle(sourceList); 
 
       CamlQuery camlQuery = new CamlQuery(); 
 
       camlQuery.ViewXml = "<View></View>"; 
 
       ListItemCollection collListItem = list.GetItems(camlQuery); 
 
       context.Load(collListItem); 
 
       context.ExecuteQuery(); 
 

 
       using(ClientContext target = new ClientContext(site1)) { 
 
       List list2 = target.Web.Lists.GetByTitle(destinationList); 
 
       foreach(ListItem oListItem in collListItem) { 
 

 
        ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation(); 
 
        ListItem AddListItem = list2.AddItem(itemCreateInfo); 
 
        AddListItem["Title"] = oListItem["Title"]; 
 
        AddListItem.Update(); 
 
        target.ExecuteQuery(); 
 
       } 
 
       } 
 
      }

ответ

1

Как вы будете идентифицировать элементы списка? По названию? Это уникально? Вы могли бы сделать две вещи:

  1. Получить все предметы из списка источников и пунктов назначения. Сделайте запрос Linq и удалите diff

Это может быть дорого, когда у вас много предметов (особенно если у вас есть> 2000 предметов).

  1. Прокрутите список Destiantion и проверьте, существует ли элемент в списке источников. Если нет, то удалите

Это также дорогостоящая задача из-за того, что Sharepoint не похожа на реляционную базу данных, и вы можете прокручивать список за считанные секунды. Перечисление через списки Sharepoint занимает много времени.

Я бы предпочел первый подход. Но я не знаю, сколько предметов мы сейчас говорим. Не могли бы вы обновить свой пост и дать нам немного больше информации о размерах списка и о том, как часто вам нужно делать это?

При обновлении элемента, вы можете также назначить автор к пункту:

 ClientContext ctx = new ClientContext("https://..."); 
     List list = ctx.Web.Lists.GetByTitle("Idea"); 
     ListItemCollection items = list.GetItems(CamlQuery.CreateAllItemsQuery()); 
     ctx.Load(items); // loading all the fields 
     ctx.ExecuteQuery(); 

     foreach (var item in items) 
     { 
      ctx.Load(item); 
      ctx.ExecuteQuery(); 
      // important thing is, that here you must have the right type 
      // i.e. item["Modified"] is DateTime 
      FieldUserValue val = item["Old_Created_By_Person"] as FieldUserValue; 

      if (val != null) 
      { 
       item["Author"] = val; 

       // do whatever changes you want 

       item.Update(); // important, rembeber changes 
       ctx.ExecuteQuery(); 
       Console.WriteLine("Updating " + item.Id); 
      } 
     } 
+0

Я бы создать суб подпрограмму для каждого из возможных типов изменений SharePoint опор (Create, Update, Delete) и добавить код в список источников через Event Receiver, который принимает соответствующее действие для обновления списка адресатов. Таким образом, после того, как вы очистите список адресатов в пакетном режиме, вы сможете выполнять небольшие, недорогие операции, чтобы синхронизировать их в будущем. Я создал похожие решения. Код STORM корректен, хотя свойства элемента в приемнике событий доступны без подключения ClientContext к вашему источнику. –

+0

Как вы называете целевой сайт в функции (например: public override void ItemAdded (свойства SPItemEventProperties)? У меня есть код, который работает так, как если бы список находился на одном сайте. Но если я обновляю код, t update. До сих пор у меня есть SPList lstOtherList = properties.Web.Lists ["DestinationList"]; SPListItem item = lstOtherList.Items.Add(); item ["StoredId"] = properties.ListItemId; item [ Title "] = properties.AfterProperties [" Title "]; item.Update(); –

+0

Вам понадобится создать второй ClientContext ... – STORM