You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:24:19