我正在尝试通过Microsoft Graph从SharePoint中获取列表项的集合,我想按CreatedBy进行过滤。
要求:https://graph.microsoft.com/v1.0/sites/{siteid}/lists/TeamRequests/items
返回:
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('{url}')/lists('TeamRequests')/items",
"value": [
{
"@odata.etag": "\"56ad787e-bd69-464a-b5da-dd953e40d7c4,13\"",
"createdDateTime": "2018-02-26T08:34:26Z",
"eTag": "\"56ad787e-bd69-464a-b5da-dd953e40d7c4,13\"",
"id": "11",
"lastModifiedDateTime": "2018-03-22T13:20:03Z",
"webUrl": "{url}/Lists/TeamRequests/11_.000",
"createdBy": {
"user": {
"email": "{email}",
"id": "9c9cbb67-c049-4a2d-845d-6c5ca2300041",
"displayName": "{Name}"
}
},
"lastModifiedBy": {
"user": {
"email": "{email}",
"id": "9c9cbb67-c049-4a2d-845d-6c5ca2300041",
"displayName": "{Name}"
}
},
"parentReference": {},
"contentType": {
"id": "0x01005F15F8133495554D834FF82F187AD0630002133A9CCDE4494D8CB2206D7D6453D6"
}
},
现在,我想为createdBy(ID,displayName或电子邮件地址)过滤此请求。我尝试了?$filter=createdBy/user/email eq '{email}'
和类似的ID或displayName请求。他们都回来了
{
"error": {
"code": "generalException",
"message": "An unspecified error has occurred.",
"innerError": {
"request-id": "492e3bde-05fe-4484-a475-435ff0aa70b6",
"date": "2018-07-23T07:41:46"
}
}
}
那么如何完成此过滤器?甚至支持吗?
答案 0 :(得分:3)
尽管听起来像是一个简单的查询,但我还没有想到比以下解决方案更简单的方法:
似乎只有提供 user id 的情况下,才支持按用户字段进行过滤,这就是该解决方案包含两个步骤的原因:
1)首先,我们需要通过public int CountryId { get; set; }
[ForeignKey("CountryId")]
public Country Country{ get; set; }
确定用户Id
,为此可以利用以下查询:
Email
*其中https://graph.microsoft.com/v1.0/sites/root/lists('User Information List')/items?expand=fields(select=Id,Email)
系统列表存储用户属性,包括ID和Email属性*
2)解决了用户User Information List
之后,可以应用通过用户ID 过滤项目的最终查询:
Id
其中
https://graph.microsoft.com/v1.0/sites/{site-id}/lists('list-name')/items?filter=fields/<user-field-name>LookupId eq '<user-id>'
是除了用户字段之外还将公开的字段,在<user-field-name>LookupId
字段的情况下,名称应为Created
示例:
AuthorLookupId
注意
在某些情况下,返回以下错误字段” 无法在filter或orderby中引用,因为它没有索引。 提供“首选:HonorNonIndexedQueriesWarningMayFailRandomly” 标头允许这样做,但要警告此类查询可能会失败 大名单。
在这种情况下,需要应用以下请求标头:
首选:HonorNonIndexedQueriesWarningMayFailRandomly
答案 1 :(得分:0)
当我尝试访问用户信息列表列表时。找不到列表错误。
因此,在我的情况下,首先我根据状态值过滤列表数据,然后下一步获得登录的用户显示名称,并根据显示名称过滤列表项。
我正在使用@pnp/graph
使用状态过滤器过滤列表数据
let resultsList = await listItemsQuery.filter("fields/RequestStatus eq 'Approval Pending'").expand("fields").get<MicrosoftGraph.ListItem[]>();
获取登录配置文件:
const profileQueryEndPoint = new GraphQueryableCollection(graph.me, "/");
从以上结果中选择displayName属性
let profileData : User = await profileQueryEndPoint.select("displayName").get <User>();
console.log('displayName : ' + profileData['displayName']);
通过传递profileData['displayName']
let filterUserCreatedRequests: MicrosoftGraph.ListItem[] = resultsList.filter(ListItem => ListItem["createdBy"].user.displayName === profileData['displayName']);
显示过滤结果
console.log('filterUserCreatedRequests : ' + JSON.stringify(filterUserCreatedRequests));
我正在提供所有步骤供您参考。但是上面的代码可以进一步简化。
希望这对某人有帮助:)