根据 singleValueExtendedProperty 的特定值搜索事件

Search for an event according to a specific value of a singleValueExtendedProperty

情况:

我们有一个旧应用程序正在 outlook 中创建事件(通过 MAPI)。为了识别事件,自定义 属性 'CTOID' 设置了一个特定值,通过该值可以再次找到事件。

对于较新的应用程序,我们希望使用图表 API,但该应用程序仍应能够 read/find 由旧应用程序创建的事件。因此,我创建了一个具有特定 CTOID 的测试事件,并且我已经可以使用图形客户端根据 属性 及其值获取上述事件(queryOptions 只是一些 start-/enddate 限制)。

// Initialize the GraphServiceClient.
GraphServiceClient client = await m_MicrosoftGraphClient.GetGraphServiceClient();

// Load user events.
var request = client.Users[userId].CalendarView.Request(queryOptions).Expand("singleValueExtendedProperties($filter=id%20eq%20'Double%20{00020329-0000-0000-C000-000000000046}%20Name%20CTOID')");
var result = await request.GetAsync();
var calendarEvents = result.CurrentPage;

结果:

正确获取事件,包括 CTOID 属性 的值。

问题:

我可以“展开”事件,以便它们包含 CTOID 属性 的值。但是 如何找到具有特定 CTOID 值的事件?具体来说,如何使用 C# 中的 Graph 客户端执行此操作?

根据 documentation and this ,以下 REST 调用应该有效:

GET /users/{id|userPrincipalName}/events?$filter=singleValueExtendedProperties/Any(ep: ep/id eq '{id_value}' and ep/value eq '{property_value}')

所以我在在线 Graph Explorer 中尝试了这个:

https://graph.microsoft.com/v1.0/users/[MY_USER_ID]/events?$filter=singleValueExtendedProperties/Any(ep: ep/id eq 'Double {00020329-0000-0000-C000-000000000046} Name CTOID' and ep/value eq '229236')

但我得到的回复是:

{
    "error": {
        "code": "ErrorInvalidUrlQueryFilter",
        "message": "The filter expression for $filter does not match to a single extended property and a value restriction.",
        "innerError": {
            "date": "2020-08-03T12:44:05",
            "request-id": "33e82c77-92ea-4865-a8d0-00cfc2f99154"
        }
    }
}

我做错了什么?我没有想法,任何帮助将不胜感激。 (此外,如果您知道如何使用 C# 中的 Graph 客户端执行此操作,而不仅仅是简单的 REST 调用)。

附加信息:

不知道这是否重要,但为我们的应用程序设置了以下权限:

在您的过滤器中,您需要将值转换为 Double 例如

https://graph.microsoft.com/v1.0/users/[MY_USER_ID]/events?$filter=singleValueExtendedProperties/Any(ep: ep/id eq 'Double {00020329-0000-0000-C000-000000000046} Name CTOID' and cast(ep/value, Edm.Double) eq 229236)

对于除过滤器中的字符串以外的任何内容,您需要执行此操作