如何通过CAML查询获取与Microsoft Graph匹配的SharePoint文档ID?
你遇到的问题核心是CSOM默认返回的Id是列表内部的自增数字ID,而UniqueId未被正确加载或使用方式不对。要获取能直接用于Microsoft Graph API的ID,需明确两个API的ID对应关系并调整CSOM代码:
1. ID对应关系说明
- Microsoft Graph 列表项API(
/sites/{site-id}/lists/{list-id}/items/{item-id}):使用CSOM中ListItem.Id(即你看到的极小数字,如3),但该API返回的是列表项元数据,需额外获取下载链接才能拿到文件内容。 - Microsoft Graph DriveItem API(
/sites/{site-id}/drives/{drive-id}/items/{item-id}):使用CSOM中ListItem.UniqueId的字符串形式(带连字符的GUID),这是直接获取文件内容的常用ID。
2. 修改后的CSOM代码
关键是在加载列表项时明确指定要获取的属性(默认加载不会包含所有字段),确保拿到UniqueId:
Web web = sp.Web; string spdocumenturl = "/sites/MySite/Shared%20Documents/My%20Site%20Documents/MyFolder"; Microsoft.SharePoint.Client.List documentlist = web.Lists.GetByTitle("Documents"); CamlQuery query = new CamlQuery(); query.FolderServerRelativeUrl = spdocumenturl; query.ViewXml = "<View Scope='RecursiveAll'><RowLimit>5000</RowLimit></View>"; ListItemCollection listItems = documentlist.GetItems(query); // 明确加载需要的属性:数字ID、GUID格式的UniqueId、文件类型标识 sp.Load(listItems, items => items.Include( item => item.Id, item => item.UniqueId, item => item.FileSystemObjectType )); sp.ExecuteQuery(); // 遍历处理每个项 foreach (ListItem item in listItems) { if (item.FileSystemObjectType == FileSystemObjectType.File) { // 用于Graph DriveItem API的ID(与Graph返回的完全匹配) string graphDriveItemId = item.UniqueId.ToString(); // 用于Graph ListItem API的ID string graphListItemId = item.Id.ToString(); // 按需存储对应的ID即可 } else if (item.FileSystemObjectType == FileSystemObjectType.Folder) { // 文件夹的Graph DriveItem ID同样使用UniqueId的字符串形式 string graphFolderId = item.UniqueId.ToString(); } }
3. 验证与使用
- 存储
graphDriveItemId后,可通过以下Graph API路径获取文件内容:
其中GET /sites/{site-id}/drives/{drive-id}/items/{graphDriveItemId}/contentsite-id为CSOM中web.Id.ToString(),drive-id为文档库的ID(documentlist.Id.ToString())。
内容的提问来源于stack exchange,提问作者TheIronCheek
相关产品推荐
相关产品推荐

