You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPF/C#应用中基于多扩展属性查询Google Calendar事件?

我来帮你搞定这个Google Calendar API的查询需求,正好之前做过类似的WPF/C#集成,下面一步步拆解实现步骤,代码都是可直接复用的:

1. 先确认基础配置到位

首先确保你已经通过NuGet安装了Google.Apis.Calendar.v3和Google.Apis.Auth相关包,并且完成了API认证(WPF里推荐用OAuth2桌面应用流,服务器端场景可使用ServiceAccount,根据你的实际情况选择)。这部分如果还没跑通,先把认证流程搞定,不然后续查询会直接报错。

2. 搞懂共享扩展属性的查询语法

Google Calendar API里的共享扩展属性(Shared Extended Properties)有特定的查询规则:

  • 检查事件是否包含某个属性:sharedExtendedProperties.hasKey='你的属性名'
  • 匹配属性的具体值:sharedExtendedProperties='属性名=属性值'
  • 多个值匹配需要用OR连接,并且要用括号把OR条件包裹起来,避免和其他查询条件冲突

因为你的EventType是枚举类型,所以需要先把枚举值转成对应的字符串(比如EventType.Training转成"Training"),再拼接成合法的查询条件。

3. 完整的查询实现代码

先定义你的EventType枚举:

public enum EventType
{
    Training,
    Meeting,
    // 可根据业务需求添加其他类型
}

然后写核心的查询工具类,包含日期范围过滤、多EventType匹配,还处理了分页(避免事件太多漏数据):

using Google.Apis.Calendar.v3;
using Google.Apis.Calendar.v3.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public class CalendarServiceHelper
{
    private readonly CalendarService _calendarService;

    public CalendarServiceHelper(CalendarService calendarService)
    {
        _calendarService = calendarService;
    }

    public async Task<List<Event>> GetFilteredEventsAsync(string calendarId, DateTime startDate, DateTime endDate, List<EventType> targetEventTypes)
    {
        var allEvents = new List<Event>();
        string nextPageToken = null;

        // 处理日期:Google API要求RFC3339格式的UTC时间,且timeMax是排他的,所以结束日期需加一天
        var timeMin = startDate.Date.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
        var timeMax = endDate.Date.AddDays(1).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ");

        // 构建多EventType的过滤条件
        var eventTypeFilters = targetEventTypes.Select(type => 
            $"sharedExtendedProperties='EventType={type.ToString()}'");
        var fullFilter = $"sharedExtendedProperties.hasKey='EventType' AND ({string.Join(" OR ", eventTypeFilters)})";

        do
        {
            var request = _calendarService.Events.List(calendarId);
            request.TimeMin = DateTime.Parse(timeMin);
            request.TimeMax = DateTime.Parse(timeMax);
            request.Q = fullFilter; // 传入拼接好的过滤条件
            request.SingleEvents = true; // 展开重复事件为单个实例(按需设置)
            request.OrderBy = EventsResource.ListRequest.OrderByEnum.StartTime;
            request.PageToken = nextPageToken;

            var response = await request.ExecuteAsync();
            allEvents.AddRange(response.Items);
            nextPageToken = response.NextPageToken;

        } while (!string.IsNullOrEmpty(nextPageToken));

        return allEvents;
    }

    // 把事件的扩展属性转换为EventType枚举
    public EventType ParseEventTypeFromEvent(Event calendarEvent)
    {
        if (calendarEvent.SharedExtendedProperties?.Properties != null &&
            calendarEvent.SharedExtendedProperties.Properties.TryGetValue("EventType", out var eventTypeStr))
        {
            if (Enum.TryParse<EventType>(eventTypeStr, out var eventType))
            {
                return eventType;
            }
        }
        // 这里可返回默认值或抛出异常,根据业务逻辑调整
        return EventType.Meeting;
    }
}
4. 关键注意事项
  • 日期处理:timeMax是排他性的,所以如果要包含endDate当天的所有事件,必须把endDate加一天再转成UTC,否则当天的事件会被过滤掉。
  • 大小写敏感:共享扩展属性的Key是大小写敏感的,确保你存储和查询时用的都是"EventType"(和示例一致),不要写错大小写。
  • 重复事件:如果需要获取重复事件的所有实例,一定要把SingleEvents设为true,否则只会返回重复事件的主事件。
  • 分页处理:如果查询结果超过API默认的最大返回数(默认250条),要通过NextPageToken循环获取所有页面的数据,避免遗漏事件。
5. 使用示例

在你的WPF ViewModel或业务代码里这样调用:

// 假设你已经初始化好了CalendarService实例
var helper = new CalendarServiceHelper(yourCalendarServiceInstance);
var targetTypes = new List<EventType> { EventType.Training, EventType.Meeting };
var start = new DateTime(2024, 5, 1);
var end = new DateTime(2024, 5, 31);

var events = await helper.GetFilteredEventsAsync("your-calendar-id@group.calendar.google.com", start, end, targetTypes);

// 遍历事件并转换EventType
foreach (var evt in events)
{
    var eventType = helper.ParseEventTypeFromEvent(evt);
    // 执行你的业务逻辑处理
}

内容的提问来源于stack exchange,提问作者ataraxia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:21:06