以编程方式将Sharepoint列表项从一个站点删除到另一个站点

时间:2015-12-30 19:47:00

标签: c# sharepoint csom sharepoint-clientobject

我正在尝试从myDestinationList中删除项目,如果mySourceList中不存在这些项目。我试图在C#中完成此方法。我有这样设置,因为这两个列表在不同的服务器上。有什么建议吗?

我还可以将源列表项中的作者/编辑器分配到目的地列表中的作者/编辑器字段吗?

更新:列表有超过2k项,客户可能每天更新一次列表或每周更新一次,这可能会有所不同。

    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
}



      }

    }

事件接收器

        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 个答案:

答案 0 :(得分:1)

您如何识别列表项?通过标题?这是独特的吗?你可以做两件事:

  1. 从源列表和目标中获取所有项目。执行Linq查询并删除diff
  2. 当你有很多物品时(特别是当你有> 2000件物品时),这可能会很昂贵。

    1. 遍历Destiantion列表并检查Source列表中是否存在项目。如果没有,则删除
    2. 这也是一项昂贵的任务,因为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);
                  }
              }