mih*_*hai 5 c# sharepoint splistitem
我正在尝试从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();
Run Code Online (Sandbox Code Playgroud)
这段代码运行良好,因此,我在指定的库中列出了所有文件夹和文件。
似乎文件详细信息以惰性方式加载。仅细节层次结构中的第一级。但是我不知道如何,FieldValues集合充满了Data。

我看到ListItem ContentType.Name尚未初始化。

是否有可能以某种方式更新查询,该方式将在此单个调用中加载ContentType的数据。
还是唯一的办法是遍历所有文件并对特定文件进行ContentType加载?
我以以下方式执行此操作:
foreach(var listItem in listItemCollection)
{
context.Load(listItem, k => k.ContentType);
context.ExecuteQuery();
var contentTypeName = listItem.ContentType.Name;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果可能的话,我将在一次调用中获取此信息,而无需在集合中进行迭代并开始对ClientContext进行多次调用。
PS:我是SharePoint编程的新手。我只想修复一个错误。
谢谢!
正如您在 SharePoint 客户端对象模型 (CSOM) 中正确注意到的那样,ClientRuntimeContext.Load 方法不会检索客户端对象的所有属性。
ClientRuntimeContext.Load 方法具有以下语法:
public void Load<T>(
T clientObject,
params Expression<Func<T, Object>>[] retrievals
)
where T : ClientObject
Run Code Online (Sandbox Code Playgroud)
其中retrievals参数用于指定必须检索的属性。
其次,由于 SharePoint CSOM 支持Request Batching,因此您的示例可以修改为以下示例:
foreach (var item in items)
{
ctx.Load(item, i => i.ContentType);
}
ctx.ExecuteQuery();
Run Code Online (Sandbox Code Playgroud)
注意:本例中只向服务器提交一次请求
但所提供的示例仍然需要向服务器发出两个请求:
并且可以通过将对服务器的请求减少到 1 个来从性能角度 进行改进。
最后的例子
该示例演示了如何检索列表项并显式指定要检索的属性:
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();
Run Code Online (Sandbox Code Playgroud)