7

У меня есть сценарий, в котором мне нужно переместить все мои данные в списке SharePoint 2010 (name = "VersionTestList") в базу данных SQL-сервера. Поскольку в списке включено управление версиями, я также хочу перенести данные предыдущей версии. В любом случае мне удалось переместить последний элемент, но, к сожалению, я не могу получить предыдущие данные. Я пробовал это с помощью Client Object Model и смог получить версии, но не смог получить ListItem соответствующей версии. Ниже вы найдете код, который я пробовал до сих пор, и дайте мне понять, как это решить.Программно получить ListItemVersion с использованием клиентской модели объекта SharePoint 2010

Кроме того, я беру версию ListItem так:

string path = web.ServerRelativeUrl + "/Lists/VersionTestTable/1_.000"; 
File file = web.GetFileByServerRelativeUrl(path); 
clientContext.Load(file, item=>item.ListItemAllFields); 
FileVersionCollection versions = file.Versions; 
clientContext.Load(versions); 
oldVersions = clientContext.LoadQuery(versions.Where(v => v != null)); 
clientContext.ExecuteQuery(); 

Мой весь код выглядит так:

class Program 
{ 
    static void Main(string[] args) 
    { 
     GetVersionsUsingCOM(); 
    } 
    public static void GetVersionsUsingCOM() 
    { 
     File file; 
     FileVersionCollection versions; 
     IEnumerable<Microsoft.SharePoint.Client.FileVersion> oldVersions; 
     ClientContext clientContext = new ClientContex("http://server:1200/test/Poc"); 
     Web web = clientContext.Web; 
     clientContext.Load(web); 
     clientContext.ExecuteQuery(); 

     string path = web.ServerRelativeUrl + "/Lists/VersionTestTable/1_.000"; 
     file = web.GetFileByServerRelativeUrl(path); 
     clientContext.Load(file, item=>item.ListItemAllFields); 
     //clientContext.ExecuteQuery(); 

     versions = file.Versions; 
     clientContext.Load(versions); 
     oldVersions = clientContext.LoadQuery(versions.Where(v => v != null)); 
     clientContext.ExecuteQuery(); 

     if (oldVersions != null) 
     { 
      foreach (Microsoft.SharePoint.Client.FileVersion _version in oldVersions) 
      { 
       int count=0; 
       Console.WriteLine(_version.CheckInComment); 
       Console.WriteLine("Version : {0}", _version.VersionLabel); 

      //// Working fine till here but unable to get the version details from version.Url 
       string versionItemUrl = web.ServerRelativeUrl +"/" + _version.Url; 
       File oldFile = web.GetFileByServerRelativeUrl(versionItemUrl); 
       clientContext.Load(oldFile, f=>f.ListItemAllFields); 
       clientContext.ExecuteQuery(); 

       Console.WriteLine(oldFile.ListItemAllFields["Name"]); 
       count++; 
      } 
      oldVersions = null; 
     } 
     Console.ReadLine(); 

    } 
} 

ответ

-1

Вы должны быть в состоянии получить данные элементов списка с помощью SPFileVersion.Properties который даст вам хеш-таблицу из метаданных файла, см. MSDN - SPFileVersion.Properties Property.

Внутри вашего foreach попробовать

Hashtable oHash = oFileVersion.Properties; 
ICollection collKeys = oHash.Keys; 

foreach (object oKey in collKeys) 
{ 
    Console.WriteLine(oKey.ToString() + " :: " + oHash[oKey.ToString()].ToString()); 
} 
+1

объект сервера модели классы не предоставляют слишком много помогает при попытке использовать объектную модель клиента. –

0

Вы должны инициализировать web.ServerRelativeUrl как этот

oldVersions = clientContext.LoadQuery(versions.Where(v => v != null)); 
clientContext.Load(web, w => w.ServerRelativeUrl); 
clientContext.ExecuteQuery(); 
+0

Не повезло, я получаю 'Указанный объект не принадлежит списку. ' – PeterX

+0

Если я использую' var oldFile = web.GetFileByServerRelativeUrl ("/" + _version.Url); clientContext.Load (файл, item => item.ListItemAllFields); clientContext.ExecuteQuery(); 'Я получаю значение« Значение не входит в ожидаемый диапазон. ». – PeterX

0

вы можете получить более старую версию файла, как это

string versionItemUrl = file.ServerRelativeUrl.Replace(Path.GetFileName(file.ServerRelativeUrl),"") + _version.Url;
File oldFile = web.GetFileByServerRelativeUrl(versionItemUrl); clientContext.Load(oldFile, f=>f.ListItemAllFields);
clientContext.ExecuteQuery();
Смежные вопросы