使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion

Posted

技术标签:

【中文标题】使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion【英文标题】:Programmatically get ListItemVersion using client object model SharePoint 2010 【发布时间】:2013-03-02 18:25:12 【问题描述】:

我有一个场景,我必须将 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();

    

【问题讨论】:

【参考方案1】:

你必须像这样初始化web.ServerRelativeUrl

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

【讨论】:

不走运,我得到The object specified does not belong to a list. 如果我使用var oldFile = web.GetFileByServerRelativeUrl("/" + _version.Url); clientContext.Load(file, item =&gt; item.ListItemAllFields); clientContext.ExecuteQuery();,我会收到Value does not fall within the expected range. 错误。【参考方案2】:

你可以像这样获取旧版本文件

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

【讨论】:

【参考方案3】:

您应该能够使用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());

【讨论】:

在尝试使用客户端对象模型时,服务器对象模型类没有提供太多帮助。

以上是关于使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion的主要内容,如果未能解决你的问题,请参考以下文章

使用客户端对象模型 SharePoint 2010 以编程方式获取 ListItemVersion

Sharepoint 2010 客户端对象模型 - 上传文档(409 冲突)

SharePoint 2010客户端对象模型 - 需要代理身份验证

SharePoint 2010 - 客户端对象模型 - 向ListItem添加附件

检查列表列是否存在使用SharePoint客户端对象模型?

SharePoint Server 对象模型(SPSite 和 SPWeb)