SharePoint获取ContentType名称

时间:2015-02-13 16:21:09

标签: 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();

此代码运行良好,因此我有一个指定库中所有文件夹和文件的列表。

似乎文件详细信息以惰性方式加载。仅来自详细信息层次结构的第一级。但我不知道如何, FieldValues 集合中充满了数据。

ListItem details

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

ContentType Name is not initialized

是否有可能以某种方式更新查询,以便在此次调用中加载 ContentType 的数据。

或者唯一的可能性是迭代所有文件并为特定文件加载ContentType?

我是通过以下方式做到的:

foreach(var listItem in listItemCollection)
{
    context.Load(listItem, k => k.ContentType);
    context.ExecuteQuery();
    var contentTypeName = listItem.ContentType.Name;
}

但是我将在一次调用中获取此信息,如果可能的话,不在集合中迭代并开始多次调用 ClientContext

P.S。:我是 SharePoint 编程的新手。我只想修复一个错误。

谢谢!

2 个答案:

答案 0 :(得分:4)

正如您在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();
  

注意:在此示例中,请求仅提交给服务器一次

但是,提供的示例仍然需要向服务器发出两个请求:

  • 检索列表项
  • 检索列表项的内容类型

并且可以通过将对服务器的请求减少到一个来从性能角度进行改进

最后的例子

该示例演示了如何检索列表项并明确指定要检索的属性:

 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();

答案 1 :(得分:0)

最后一个例子不起作用(在SP2010中)。

有一个例外“不支持查询表达式” 如果您明确说明了所有必填字段,则下面的解决方案可以正常工作。

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();