我试图在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;
但它不起作用:
老实说,我不知道我在这里做了什么,因为很难告诉我各种Id的含义(DocId,WorkId,UniqueId,只提三个......)。Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException: 财产或字段'名称'尚未初始化。它一直没有 请求或请求尚未执行。它可能需要 明确要求。
任何拥有更多Sharepoint经验的人都可以告诉我这里的方式吗?
答案 0 :(得分:2)
错误:
Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException: 财产或字段'名称'尚未初始化。它一直没有 请求或请求尚未执行。它可能需要 明确要求。
表示尚未请求客户端对象(File
) 。为了请求客户端对象,需要ClientRuntimeContext.Load和ClientRuntimeContext.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) };
}