根据 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)
对于除过滤器中的字符串以外的任何内容,您需要执行此操作
情况:
我们有一个旧应用程序正在 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
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)
对于除过滤器中的字符串以外的任何内容,您需要执行此操作