SharePoint 获取内容类型名称
SharePoint get ContentType Name
我正在尝试从 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 编程的新手。我只是想修复一个错误。
谢谢!
正如您在 SharePoint 客户端对象模型 (CSOM) 中正确注意到的那样 ClientRuntimeContext.Load Method 不会检索客户端对象的所有属性。
ClientRuntimeContext.Load Method 具有以下语法:
public void Load<T>(
T clientObject,
params Expression<Func<T, Object>>[] retrievals
)
where T : ClientObject
其中 retrievals
参数用于指定必须检索的属性。
其次,由于 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();
最后一个示例不起作用(在 SP2010 中)。
有一个例外"The query expression is not supported"
如果您明确说明所有必填字段,则以下解决方案有效。
var listTitle = "Documents";
var query = new CamlQuery();
query.ViewXml = "<View Scope='RecursiveAll' />";
var items = ctx.Web.Lists.GetByTitle(listTitle).GetItems(query);
string[] fieldsToMigrate = new string[] { "Title", "FieldA", "FieldB" };
ctx.Load(items, a => a.Include(b => b.ContentType, b => b["FileRef"]));
foreach (var f in fieldsToLoad) {
ctx.Load(items, includes => includes.Include(a => a[f]));
}
ctx.ExecuteQuery();
我正在尝试从 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 编程的新手。我只是想修复一个错误。
谢谢!
正如您在 SharePoint 客户端对象模型 (CSOM) 中正确注意到的那样 ClientRuntimeContext.Load Method 不会检索客户端对象的所有属性。
ClientRuntimeContext.Load Method 具有以下语法:
public void Load<T>(
T clientObject,
params Expression<Func<T, Object>>[] retrievals
)
where T : ClientObject
其中 retrievals
参数用于指定必须检索的属性。
其次,由于 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();
最后一个示例不起作用(在 SP2010 中)。
有一个例外"The query expression is not supported" 如果您明确说明所有必填字段,则以下解决方案有效。
var listTitle = "Documents";
var query = new CamlQuery();
query.ViewXml = "<View Scope='RecursiveAll' />";
var items = ctx.Web.Lists.GetByTitle(listTitle).GetItems(query);
string[] fieldsToMigrate = new string[] { "Title", "FieldA", "FieldB" };
ctx.Load(items, a => a.Include(b => b.ContentType, b => b["FileRef"]));
foreach (var f in fieldsToLoad) {
ctx.Load(items, includes => includes.Include(a => a[f]));
}
ctx.ExecuteQuery();