Office 365 日历 API - 在 C# 客户端库中按日期过滤事件
Office 365 Calendar API - Filtering Events by Date in C# Client Libraries
在客户端库中,您可以对日历事件请求应用 LINQ 过滤:
var events = await (from i in Client.Me.Events where i.Subject == "Desired Event Name" select i)
.Take(50)
.ExecuteAsync();
或者可以使用 Where 方法,但是对于 Start 和 End 字段,当我们由于 DateTimes 存储为字符串,因此无法使用来自特定时间段过滤的事件。调用 DateTime.Parse 方法导致异常。
这绝对应该是可以实现的,我什至认为在某些时候这是可能的,并且可以通过 REST 来完成。 begin/finish 属性 根据文档编制索引。当然,一旦收到结果就可以对其进行过滤,但在那种情况下,我开始收集四年前的事件。用这种方法把IPagedCollection中的所有页面都翻一遍确实要花很多时间。幸运的是,尽管事件似乎是按日期排序的,所以一旦事件在您的时间段之后开始,您就可以停止获取新页面。
我。我仍然没有找到使用 LINQ 查询事件的解决方案。要查看指定的时间间隔,可以使用
Client.Me.CalendarView(from as DateTimeOffset, to as DateTimeOffset)
或 Client.Me.Calendars["<valid calendar id>"].CalendarView(from, to)
。按功能过滤可能是客户端代码独有的。
您正在初始化 OutLookServicesClient 的哪个版本的 Office 365 REST API?我可以使用 v1.0 API 过滤事件。您可以参考下面的代码使用 LINQ 来过滤开始和结束 属性:
OutlookServicesClient client = new OutlookServicesClient(new Uri("https://outlook.office.com/api/v1.0/"), () =>
{
return Task.Delay(10).ContinueWith(t => accessToken);
});
var events = await (from i in client.Me.Events where (i.Start > DateTimeOffset.Parse("2016-07-18") && i.End< DateTimeOffset.Parse("2016-07-25")) select i)
.Take(50)
.ExecuteAsync();
foreach (var appointment in events.CurrentPage)
{
Console.WriteLine($"{appointment.Subject}:\t{appointment.Start}~{appointment.End}");
}
更新(V2.0)
安装 V2.0 管理程序集Install-Package Microsoft.Office365.OutlookServices-V2.0
代码:
OutlookServicesClient client = new OutlookServicesClient(new Uri("https://outlook.office.com/api/v2.0/"), () =>
{
return Task.Delay(10).ContinueWith(t => accessToken);
});
var events = await (from i in client.Me.Events where (i.Start.DateTime.CompareTo("2016-07-18")>0 && i.End.DateTime.CompareTo("2016-07-25")<0) select i)
.Take(50)
.ExecuteAsync();
foreach (var appointment in events.CurrentPage)
{
Console.WriteLine($"{appointment.Subject}:\t{appointment.Start}~{appointment.End}");
}
在客户端库中,您可以对日历事件请求应用 LINQ 过滤:
var events = await (from i in Client.Me.Events where i.Subject == "Desired Event Name" select i)
.Take(50)
.ExecuteAsync();
或者可以使用 Where 方法,但是对于 Start 和 End 字段,当我们由于 DateTimes 存储为字符串,因此无法使用来自特定时间段过滤的事件。调用 DateTime.Parse 方法导致异常。 这绝对应该是可以实现的,我什至认为在某些时候这是可能的,并且可以通过 REST 来完成。 begin/finish 属性 根据文档编制索引。当然,一旦收到结果就可以对其进行过滤,但在那种情况下,我开始收集四年前的事件。用这种方法把IPagedCollection中的所有页面都翻一遍确实要花很多时间。幸运的是,尽管事件似乎是按日期排序的,所以一旦事件在您的时间段之后开始,您就可以停止获取新页面。
我。我仍然没有找到使用 LINQ 查询事件的解决方案。要查看指定的时间间隔,可以使用
Client.Me.CalendarView(from as DateTimeOffset, to as DateTimeOffset)
或 Client.Me.Calendars["<valid calendar id>"].CalendarView(from, to)
。按功能过滤可能是客户端代码独有的。
您正在初始化 OutLookServicesClient 的哪个版本的 Office 365 REST API?我可以使用 v1.0 API 过滤事件。您可以参考下面的代码使用 LINQ 来过滤开始和结束 属性:
OutlookServicesClient client = new OutlookServicesClient(new Uri("https://outlook.office.com/api/v1.0/"), () =>
{
return Task.Delay(10).ContinueWith(t => accessToken);
});
var events = await (from i in client.Me.Events where (i.Start > DateTimeOffset.Parse("2016-07-18") && i.End< DateTimeOffset.Parse("2016-07-25")) select i)
.Take(50)
.ExecuteAsync();
foreach (var appointment in events.CurrentPage)
{
Console.WriteLine($"{appointment.Subject}:\t{appointment.Start}~{appointment.End}");
}
更新(V2.0)
安装 V2.0 管理程序集Install-Package Microsoft.Office365.OutlookServices-V2.0
代码:
OutlookServicesClient client = new OutlookServicesClient(new Uri("https://outlook.office.com/api/v2.0/"), () =>
{
return Task.Delay(10).ContinueWith(t => accessToken);
});
var events = await (from i in client.Me.Events where (i.Start.DateTime.CompareTo("2016-07-18")>0 && i.End.DateTime.CompareTo("2016-07-25")<0) select i)
.Take(50)
.ExecuteAsync();
foreach (var appointment in events.CurrentPage)
{
Console.WriteLine($"{appointment.Subject}:\t{appointment.Start}~{appointment.End}");
}