簡體   English   中英

SharePoint獲取ContentType名稱

[英]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詳細信息

我看到ListItem ContentType.Name沒有初始化。

ContentType Name未初始化

是否有可能以某種方式更新查詢,該方式將在此單個調用中加載ContentType的數據。

或者唯一的可能性是迭代所有文件並為特定文件加載ContentType?

我通過以下方式做到了這一點:

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

但是我將在一次調用中獲取此信息,如果可能的話,不在集合中迭代並開始多次調用ClientContext

PS:我是SharePoint編程的新手。 我只是想修復一個bug。

謝謝!

正如您在SharePoint客戶端對象模型(CSOM)中正確注意到的那樣, ClientRuntimeContext.Load方法不會檢索客戶端對象的所有屬性。

ClientRuntimeContext.Load方法具有以下語法:

public void Load<T>(
    T clientObject,
    params Expression<Func<T, Object>>[] retrievals
)
where T : ClientObject        

其中retrievals參數的目的是用於指定要被檢索的屬性。

其次,由於SharePoint CSOM支持請求批處理 ,因此可以將您的示例修改為以下示例:

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

最后一個例子不起作用(在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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM