Программное получение ListItemVersion с помощью клиентской объектной модели SharePoint 2010

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

Кроме того, я использую версию 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();

    }
}

person Febin J S    schedule 14.03.2013    source источник


Ответы (3)


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

oldVersions = clientContext.LoadQuery(versions.Where(v => v != null));
clientContext.Load(web, w => w.ServerRelativeUrl);
clientContext.ExecuteQuery();
person Stan    schedule 12.11.2013
comment
Не повезло, я получаю The object specified does not belong to a list. - person PeterX; 11.06.2015
comment
Если я использую var oldFile = web.GetFileByServerRelativeUrl("/" + _version.Url); clientContext.Load(file, item => item.ListItemAllFields); clientContext.ExecuteQuery();, я получаю ошибку Value does not fall within the expected range.. - person PeterX; 11.06.2015

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

string versionItemUrl = file.ServerRelativeUrl.Replace(Path.GetFileName(file.ServerRelativeUrl),"") + _version.Url;
File oldFile = web.GetFileByServerRelativeUrl(versionItemUrl); clientContext.Load(oldFile, f=>f.ListItemAllFields);
clientContext.ExecuteQuery();
person selva kumar    schedule 02.04.2016

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

Внутри вашей foreach попытки

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

foreach (object oKey in collKeys)
{
    Console.WriteLine(oKey.ToString() + " :: " + oHash[oKey.ToString()].ToString());
}
person Aquila Sands    schedule 01.08.2013
comment
Классы серверной объектной модели не слишком помогают при попытке использовать клиентскую объектную модель. - person Petri K; 11.11.2013