如何通过其唯一ID获取Sharepoint上的文档?

时间:2015-07-26 12:46:28

标签: sharepoint csom

我试图在Sharepoint在线实例上使用Sharepoint客户端对象模型(CSOM)来实现以下目标:

  • 在整个方面执行关键字查询
  • 存储一些唯一标识搜索结果的字段值(查询返回的SharepointResultTable中的一行
  • 使用此存储的字段值,在稍后的某个位置或其他位置(此时我不再拥有结果表)检索结果表行中提供的相同信息。

在伪代码中:

var results = Sharepoint.GetSearchResults("Keyword");
var specificItem = results[2];
var itemId = sepcificItem.UniqueId;
Store(itemId);

后来:

var itemId = LoadItemId();
var item = Sharepoint.GetItem(itemId);

查询部分工作正常,我得到一个搜索结果表,为每个结果提供大量字段值,例如不同的URL以及唯一标识符,标题等。

var clientContext = new ClientContext(SharepointUri);
clientContext.Credentials = new SharePointOnlineCredentials(SharepointUserName, GetSecureString(SharepointPassword));
var keywordQuery = new KeywordQuery(clientContext);
keywordQuery.QueryText = keyword;
var searchExecutor = new SearchExecutor(clientContext);
var sharepointResultTable = searchExecutor.ExecuteQuery(keywordQuery);
clientContext.ExecuteQuery();
foreach (var resultRow in sharepointResultTable.Value[0].ResultRows)
{
    var path = (string) resultRow["ServerRedirectedURL"];
    var id = Guid.Parse((string) resultRow["UniqueId"]);        
}

我现在缺少的部分是:我应该为结果行存储哪些值,以及如何根据此数据执行高效查询以便稍后获取该项目?(当然我可以再次使用相同的关键字执行查询,但是因为我知道id或我存储的任何内容,所以必须有更有效的方法。此外,该项目可能不是之前关键字的结果,因为它可能已经改变了。)

我已尝试使用结果表列中的ID' UniqueId':

var clientContext = new ClientContext(SharepointUri);
clientContext.Credentials = new SharePointOnlineCredentials(SharepointUserName, GetSecureString(SharepointPassword));
var file = clientContext.Web.GetFileById(location);
clientContext.ExecuteQuery();
Console.WriteLine(file.Name);
return true;

但它不起作用:

  

Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException:   财产或字段'名称'尚未初始化。它一直没有   请求或请求尚未执行。它可能需要   明确要求。

老实说,我不知道我在这里做了什么,因为很难告诉我各种Id的含义(DocId,WorkId,UniqueId,只提三个......)。

任何拥有更多Sharepoint经验的人都可以告诉我这里的方式吗?

1 个答案:

答案 0 :(得分:2)

错误:

  

Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException:   财产或字段'名称'尚未初始化。它一直没有   请求或请求尚未执行。它可能需要   明确要求。

表示尚未请求客户端对象(File 。为了请求客户端对象,需要ClientRuntimeContext.LoadClientRuntimeContext.LoadQuery方法。

<强>实施例

//1. Retrieve File
var file = ctx.Web.GetFileById(id);
ctx.Load(file);
ctx.ExecuteQuery();


//2.Explicitly specify what properties (e.g. `Name`) to retrieve 
var file = ctx.Web.GetFileById(id);
ctx.Load(file, f=>f.Name);
ctx.ExecuteQuery();

另一方面,由于SharePoint Search Query API会跨网站集返回结果,因此您需要考虑为ClientContext指定正确的网址,以便检索File,例如:

using (var ctx = GetContext(webUri, userName, password))
{

     var keywordQuery = new KeywordQuery(ctx) {QueryText = queryText};
     var searchExecutor = new SearchExecutor(ctx);
     var resultTables = searchExecutor.ExecuteQuery(keywordQuery);
     ctx.ExecuteQuery();
     foreach (var resultRow in resultTables.Value[0].ResultRows)
     {
          var itemWebUri = new Uri((string)resultRow["SPWebUrl"]); //<- get web url of item
          var itemId = Guid.Parse((string)resultRow["UniqueId"]);


          using (var curCtx = GetContext(itemWebUri, userName, password))
          {
              var file = curCtx.Web.GetFileById(itemId);
              curCtx.Load(file, f => f.Name);
              curCtx.ExecuteQuery();
              Console.WriteLine(file.Name);     
          }        
     }
}

,其中

    public static ClientContext GetContext(Uri webUri, string userName, string password)
    {
        var securePassword = new SecureString();
        foreach (var ch in password) securePassword.AppendChar(ch);
        return new ClientContext(webUri) { Credentials = new SharePointOnlineCredentials(userName, securePassword) };
    }