我试图从SharePoint库中获取所有文件夹和文件,执行单个请求.
CamlQuery query = new CamlQuery();
query.ViewXml = "<View Scope='RecursiveAll' />";
var libraryName = "Specific Documents";
ListItemCollection itemsRaw = clientContext.Web.Lists.GetByTitle(libraryName).GetItems(query);
clientContext.Load(itemsRaw);
clientContext.ExecuteQuery();
此代码运行良好,因此我有一个指定库中的所有文件夹和文件的列表.
似乎文件细节以惰性方式加载.仅来自详细信息层次结构的第一级.但我不知道如何,FieldValues集合充满了数据.
我看到ListItem ContentType.Name没有初始化.
是否有可能以某种方式更新查询,该方式将在此单个调用中加载ContentType的数据.
或者唯一的可能性是迭代所有文件并为特定文件加载ContentType?
我通过以下方式做到了这一点:
foreach(var listItem in listItemCollection)
{
context.Load(listItem, k => k.ContentType);
context.ExecuteQuery();
var contentTypeName = listItem.ContentType.Name;
}
但是我将在一次调用中获取此信息,如果可能的话,不在集合中迭代并开始多次调用ClientContext.
P.S.:我是SharePoint编程的新手.我只是想修复一个bug.
谢谢!
解决方法:
正如您在SharePoint客户端侧对象模型(CSOM)中正确注意到的那样,ClientRuntimeContext.Load Method不会检索客户端对象的所有属性.
ClientRuntimeContext.Load Method具有以下语法:
public void Load<T>(
T clientObject,
params Expression<Func<T, Object>>[] retrievals
)
where T : ClientObject
其中retrievevals参数用于指定必须检索的属性.
其次,由于SharePoint CSOM支持Request Batching,您的示例可以修改为此示例:
foreach (var item in items)
{
ctx.Load(item, i => i.ContentType);
}
ctx.ExecuteQuery();
Note: request is submitted to the server only once in this example
但仍然提供的示例需要向服务器发出两个请求:
>检索列表项
>检索列表项的内容类型
通过将对服务器的请求减少到一个,可以从性能角度改进它.
最后的例子
该示例演示了如何检索列表项并明确指定要检索的属性:
var listTitle = "Documents";
var query = new CamlQuery();
query.ViewXml = "<View Scope='RecursiveAll' />";
var items = ctx.Web.Lists.GetByTitle(listTitle).GetItems(query);
ctx.Load(items,icol => icol.Include(
i => i.ContentType,
i => i.FieldValues));
ctx.ExecuteQuery();
标签:c,sharepoint,splistitem 来源: https://codeday.me/bug/20190623/1275533.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。