Azure Graph .NET SDK:用户查询Select参数大小写无关,成员查询则否?
这是因为用户查询和组成员查询返回的实体类型本质不同:
用户查询(
Users.GetAsync):返回的是明确的User类型集合,SDK内部已将C#类的DisplayName等属性与Graph API的驼峰字段名(displayName)做了映射。当你用nameof(User.DisplayName)得到字符串"DisplayName"时,SDK会自动将其转换为Graph API识别的displayName,因此查询能正常返回数据。组成员查询(
Groups/{id}/Members.GetAsync):返回的是DirectoryObject类型的集合——这是User、Group、Device等目录实体的基类。由于返回结果是多态类型,SDK无法确定你指定的nameof(User.DisplayName)对应哪个派生类的属性,不会自动做属性名到Graph API字段名的转换,直接将"DisplayName"作为查询参数发送给API。但Graph API的字段名是驼峰格式的displayName,因此API无法匹配到对应字段,导致返回的实体中没有这些属性,最终AdditionalData为空。
解决方法
直接使用Graph API原生驼峰字段名:就是你当前可行的方式,直接传入
"displayName"、"mail"等字符串。指定返回类型为User:调用成员查询时,明确指定只返回
User类型的成员,这样SDK就能正确识别属性映射,支持nameof语法:var usersResponse = await _graphServiceClient.Groups[azureGroupId].Members["microsoft.graph.user"].GetAsync(request => { request.QueryParameters.Select = new[] { nameof(User.DisplayName), nameof(User.Mail), nameof(User.PreferredLanguage) }; }, cancellationToken: cancellationToken);这里通过
Members["microsoft.graph.user"]指定只获取用户类型的成员,返回结果直接是User集合,和用户查询的逻辑一致,nameof就能正常工作了。
内容的提问来源于stack exchange,提问作者DTul

