gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:15:38 27 4
gpt4 key购买 nike

我正在尝试在 Sharepoint Online 实例上使用 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 或我存储的任何内容,必须有更有效的方法。此外,该项目可能不是以前的关键字不再存在,因为它可能已更改)。

我试过了,使用结果表列“UniqueId”中的 id:

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: The property or field 'Name' has not been initialized. It has not been requested or the request has not been executed. It may need to be explicitly requested.

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

有更多 Sharepoint 经验的人可以告诉我这里的路吗?

最佳答案

错误:

Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException: The property or field 'Name' has not been initialized. It has not been requested or the request has not been executed. It may need to be explicitly requested.

告诉客户端对象(文件)还没有被请求。为了请求客户端对象,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 搜索查询 API 跨网站集返回结果,您需要考虑为 ClientContext 指定正确的 url 以便检索 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) };
}

关于sharepoint - 如何通过其唯一 ID 获取 Sharepoint 上的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31637101/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com