使用MS Graph获取SharePoint Online列表项时CRTechnicalArea字段缺失问题
1. 字段内部名称不匹配
SharePoint Online的字段显示名称和内部名称可能存在差异,尤其是字段创建时包含空格、特殊字符的场景,内部名称会自动转义(例如显示名CR Technical Area的内部名可能为CR_x0020_Technical_x0020_Area)。你当前查询使用的CRTechnicalArea如果是显示名而非实际内部名,Graph会自动忽略不存在的字段,不会报错也不会返回对应值。
排查方式:进入SharePoint列表设置,点击对应字段查看浏览器地址栏的
Field参数值,即为字段实际内部名。
2. 字段级权限限制
如果你用于调用MS Graph的身份(委托权限账号/应用权限的服务主体)没有该字段的读取权限,SharePoint会自动在返回结果中剔除该字段,不会返回权限错误提示。
排查方式:使用和调用Graph相同的账号访问SharePoint列表前端,确认是否可以查看该字段的值。
3. 空字段自动省略
MS Graph查询SharePoint列表时,默认会省略所有值为空的字段,不会返回null占位。如果你查询的所有符合过滤条件的列表项,CRTechnicalArea字段均未赋值,返回结果中就不会出现该字段。
排查方式:在SharePoint列表中手动给某个符合过滤条件的项的
CRTechnicalArea字段赋值后,重新调用接口测试。
4. 查询语法写法问题
你当前使用QueryOption拼接参数的写法可能存在参数解析异常,建议替换为Graph SDK原生的Expand、Filter方法调用,写法参考如下:
var resultListsItems = await graphServiceClient.Sites[siteId] .Lists[listId] .Items .Request() .Expand("fields($select=CRItemIDNintex, CRChangeTitle, CRCategory, CRTechnicalArea, CRStatus)") .Filter("startswith(fields/CRStatus, '60') or startswith(fields/CRStatus, '70')") .GetAsync();
5. 特殊字段类型适配问题
如果CRTechnicalArea是查找字段、托管元数据字段、用户字段这类复杂类型字段,需要额外配置参数才能返回对应值,例如查找字段需要指定返回ID还是显示值,不能直接和普通单行文本次段一样在select中声明即可。
内容的提问来源于stack exchange,提问作者Matjaž Reberc

