![](/img/trans.png)
[英]how to get file extension (not from its name or from 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 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.