Microsoft Graph查询DriveItem时CreatedBy.User属性偶现为null如何解决
问题根因
出现该问题核心是两个原因:
- 现有请求仅显式展开了
ListItem属性,未指定返回嵌套的CreatedBy.User字段。Microsoft Graph在返回大结果集(超过单页阈值,通常200条以上)时,会自动裁剪未显式声明的嵌套属性,不会默认填充用户信息,因此条目少的站点单页可返回完、看似正常,大站点触发分页后就会出现字段为null的情况。 - 现有翻页逻辑未保留初始请求的Expand配置,4.x版本的Microsoft Graph SDK生成
NextPageRequest时不会自动继承上一页的查询参数,翻页后请求丢失Expand配置,进一步导致后续页字段缺失。
解决方案
1. 修正请求Expand配置,显式声明需要返回的嵌套字段
不要仅展开ListItem,查询时需明确指定要展开CreatedBy.User属性,同时移除同步阻塞的.Result调用(容易引发上下文死锁),翻页时手动给下一页请求补上相同查询配置,避免参数丢失。
修正后代码示例:
var items = await GetChildren(_client.Sites[siteId].Drive.Root.Children).ToListAsync(); private static async IAsyncEnumerable<DriveItem> GetChildren(IDriveItemChildrenCollectionRequestBuilder builder) { // 初始请求显式声明需要展开的字段,包含CreatedBy属性 var page = await builder.Request() .Expand(d => new { d.ListItem, d.CreatedBy }) .GetAsync(); foreach (var driveItem in page) { // 增加空值判断,兼容极端场景字段缺失 if (driveItem.CreatedBy?.User != null) { yield return driveItem; } } while (page.NextPageRequest is not null) { // 翻页时重新指定Expand参数,避免SDK丢失查询配置 var nextPageBuilder = new DriveItemChildrenCollectionRequest(page.NextPageRequest.RequestUrl, _client); page = await nextPageBuilder .Expand(d => new { d.ListItem, d.CreatedBy }) .GetAsync(); foreach (var driveItem in page) { if (driveItem.CreatedBy?.User != null) { yield return driveItem; } } } }
2. 超大规模文档库优化方案:直接查询ListItem端点
如果文档库条目超过10万,DriveItem端点的字段裁剪策略会更激进,此时更稳定的方式是直接请求文档库对应的ListItem集合,显式Select需要的字段,避免隐式裁剪:
// 直接获取文档库对应的列表,查询ListItem var list = await _client.Sites[siteId].Drive.List.Request().GetAsync(); var listItems = _client.Sites[siteId].Lists[list.Id].Items.Request() .Expand(i => new { i.DriveItem, i.CreatedBy.User }) .Top(5000) // 单页拉取最大支持条目数,减少请求次数 .GetAsync();
该方式查询性能比遍历DriveItem Children高30%以上,字段返回更稳定,不会因结果集过大自动裁剪显式声明的属性。
注意事项
- 不要依赖Graph的默认字段返回,所有业务需要的嵌套属性都必须在Expand/Select中显式声明,大结果集下默认返回的字段会比小结果集少很多。
- 翻页时不要直接调用SDK生成的
NextPageRequest的Get方法,老版本SDK不会保留自定义查询参数,必须重新给下一页请求配置相同的Expand/Select规则。 - 所有用户属性访问前必须加非空判断,即使配置正确,也可能存在孤立文件(创建用户已被彻底删除、租户信息同步延迟)导致
CreatedBy.User为null的场景,避免程序崩溃。
内容的提问来源于stack exchange,提问作者cescara
相关产品推荐
相关产品推荐

