3

几天来,我一直在阅读文档并使用不同的 EventQuery 参数。我正在使用 C# .NET 和 google 的 .net api 从我设置的公共日历中获取事件。我可以从 api 获取事件就好了,但我不能让它按日期给我下一个即将发生的事件。我的日历混合了重复事件和一次性事件。我已经阅读了互联网上的内容以在请求 uri 中使用直接查询参数字符串,但在 .net api 结构中使用它时似乎无法正常工作。这是我目前的基础:

CalendarService myService = new CalendarService("testGoogleCalendar-1");
EventQuery myQuery = new EventQuery();
myQuery.Uri = new Uri(CalendarURI);
myQuery.NumberToRetrieve = NumberOfEvents;
EventFeed calFeed = myService.Query(myQuery);
foreach (AtomEntry entry in calFeed.Entries)
{
    LiteralControl test = new LiteralControl("<p><b>" + entry.Title.Text + "</b></p>");
    this.Controls.Add(test);
}            

我曾尝试与 EventQuery 的成员 StartDate、StartTime、EndTime、SortOrder、FutureEvents 一起玩,甚至尝试将“?orderby = starttime”添加到 CalendarURI 本地成员。

api 查询似乎返回事件发布日期的顺序,即我在日历中创建事件的时间,而不是事件将要发生的时间。

我也一直在尝试从 AtomEntry 对象中获取事件的日期和时间,这样我就可以自己对其进行排序并使用我的控件中的标题对其进行格式化,但我看到它的唯一位置是在 AtomEntry 的 Content.Content 中也有其他我真的不想要的东西。AtomEntry 是否有 DateTime 成员,所以我可以得到日期?

这个现在真的让我很困惑,所以任何帮助表示赞赏。

4

7 回答 7

4
 myQuery.ExtraParameters = "orderby=starttime&sortorder=ascending";

奇迹般有效!

于 2009-08-20T22:37:42.797 回答
4

我没有使用 .NET 的 GData 日历 API,但我对 Java 非常熟悉。事件的开始时间将取决于事件的类型。重复事件本身没有任何开始时间,但“单个”事件实际上可能有多次。这些存储为<gd:when>元素 - 这就是您需要寻找的。

它看起来orderby=starttime确实应该工作。可能值得使用 WireShark 或类似的东西来查看确切的查询发出和返回的确切结果,以检查它是否不是 API 中导致问题的东西 - 特别是,可能是在 Uri 属性中使用它不是出于某种原因支持...

编辑:您是否尝试过设置

query.ExtraParameters = "orderby=starttime";

? 这可能是让它进入最终查询 uri 的最安全的方法......

于 2009-06-26T16:30:21.633 回答
1

OP 可能为时已晚,但我发现这个属性可以对结果进行排序。它可能对某人有帮助;)

var query = new EventQuery(FEED_URL);    
query.SortOrder = CalendarSortOrder.ascending;
于 2011-12-06T10:55:28.887 回答
0

这是在日历 API 的 Google Doc 上:

EventQuery myQuery = new EventQuery(feedUrl);
myQuery.StartTime = new DateTime(2007, 1, 5);
myQuery.EndTime = new DateTime(2007, 1, 7);

EventFeed myResultsFeed = myService.Query(myQuery);

你可以在这里阅读更多关于它的信息。

于 2009-06-26T16:18:25.860 回答
0

为了得到日期,我用 Linq Query 做了这样的事情。

public static IEnumerable<EventDto> FindTopEvent(this AtomEntryCollection items, int cnt)
{
    return (from  item in items.OfType<EventEntry>()
            select new EventDto
            {
                Url = item.FeedUri,
                Title = item.Title.Text,
                Date = item.Times[0].StartTime.ToShortDateString()
            }).Take(cnt);
}

如果您有经常性事件,您可能需要考虑执行以下操作:

Date = (item.Times.Count > 0) ? item.Times[0].StartTime.ToShortDateString() : ""

此外,将您的SingleEvent财产设置EventQuerytrue将有所帮助。

于 2009-09-30T03:24:57.847 回答
0

您可能还想确保您没有收到取消的事件,如果您只删除第一次出现的重复事件,然后删除序列中的剩余事件,您可能会遇到这种情况。您删除的序列中的这些剩余事件实际上并未被删除,而是在幕后将它们的状态设置为取消。

在代码中不读取这些事件的唯一方法是检查 EventEntry 的 Status 属性。

于 2011-10-13T15:16:46.307 回答
0
EventQuery query = new EventQuery();
query.Uri = new Uri("https://www.google.com/calendar/feeds/" + this.Service.Credentials.Username + "/private/full");
query.ExtraParameters = "orderby=starttime&sortorder=ascending";
query.SingleEvents = true;
query.StartTime = DateTime.Now;
query.EndTime = DateTime.Now.AddDays(7.0);

EventFeed calFeed = this.Service.Query(query);

List<SyndicationItem> items = new List<SyndicationItem>();
foreach (var entry in calFeed.Entries)
{
   EventEntry eventEntry = entry as Google.GData.Calendar.EventEntry;
   if (eventEntry != null)
   {
      if (eventEntry.Times.Count != 0)
      {
         DateTime dt = eventEntry.Times[0].StartTime;
    }
}

为我工作。

于 2010-12-19T19:52:23.210 回答