如何通过Microsoft Graph中的Created筛选SharePoint列表项?

时间:2018-07-23 07:43:03

标签: sharepoint microsoft-graph

我正在尝试通过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"
        }
    }
}

那么如何完成此过滤器?甚至支持吗?

2 个答案:

答案 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']

过滤具有创建者字段的Lis​​tItems
let filterUserCreatedRequests: MicrosoftGraph.ListItem[] = resultsList.filter(ListItem => ListItem["createdBy"].user.displayName === profileData['displayName']);

显示过滤结果

console.log('filterUserCreatedRequests : ' + JSON.stringify(filterUserCreatedRequests));

我正在提供所有步骤供您参考。但是上面的代码可以进一步简化。

希望这对某人有帮助:)