繁体   English   中英

使用 Microsoft Graph 查询驱动器项目时,CreatedBy.User 属性有时为空

[英]When querying drive items using Microsoft Graph, CreatedBy.User property is sometimes null

我正在从多个 SharePoint Online 网站的默认文档库中检索驱动器项目。 除其他外,我需要CreatedBy.User属性中的用户信息。

对于某些站点,我可以毫无问题地访问该属性,但对于一个站点,代码崩溃,因为该属性为空。 巧合的是,这发生在具有最多驱动器项目的站点上。

这些是相关的代码部分。

var items = await GetChildren(_client.Sites[siteId].Drive.Root.Children).ToListAsync();

private static async IAsyncEnumerable<DriveItem> GetChildren(IDriveItemChildrenCollectionRequestBuilder builder)
{
    var page = builder.Request()
        .Expand(d => d.ListItem)
        .GetAsync().Result;

    foreach (var driveItem in page)
    {
        yield return driveItem;
    }

    while (page.NextPageRequest is not null)
    {
        page = await page.NextPageRequest.GetAsync();

        foreach (var driveItem in page)
        {
            yield return driveItem;
        }
    }
}

如何强制请求始终包含CreatedBy.User信息? 当我另外请求该特定属性时,它确实可以工作,但是进行如此多的单独调用并不是一个真正的选择。 该文档库中的项目太多了。

driveItem 资源具有createdByUser关系,这是创建该项目的用户的身份。

您可以展开createdByUser以避免额外的请求。

...
var page = builder.Request()
        .Expand("listItem,createdByUser")
        .GetAsync().Result;
...

无需为每个CreatedBy发送请求即可使其工作,尽管我对解决方案并不感到兴奋。

事实证明,至少对于该特定站点,仅当我展开ListItemCreatedBy.User才为空。 如果我遗漏了ExpandCreatedBy.User会很好地返回。

所以我决定收集所有ListItems ,除了DriveItems

private async IAsyncEnumerable<ListItem> GetListItems(IListItemsCollectionRequestBuilder builder)
{
    var page = await builder
        .Request()
        .Expand("fields")
        .GetAsync();

    foreach (var listItem in page)
    {
        yield return listItem;
    }

    while (page.NextPageRequest is not null)
    {
        page = await page.NextPageRequest.GetAsync();

        foreach (var listItem in page)
        {
            yield return listItem;
        }
    }
}

在查看DriveItem时,我从列表中拉出匹配的ListItem 这样我就可以得到我需要的所有信息。 它有效,但我更喜欢扩展ListItem的选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM