我一直在阅读文档并使用不同的EventQuery参数。我正在使用带有谷歌.net api的C#.NET从我设置的公共日历中获取事件。我可以从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成员,所以我可以得到日期?
这个让我很困惑,所以任何帮助都会受到赞赏。
答案 0 :(得分:4)
我没有使用过.NET的GData日历API,但我对Java非常熟悉。事件的开始时间取决于事件的类型。周期性事件没有任何开始时间,但“单个”事件实际上可能有多次。它们存储为<gd:when>
元素 - 这就是您需要查找的内容。
看起来orderby=starttime
确实应该工作。可能值得使用WireShark或类似的东西来查看确切的查询结果和确切的结果返回,检查它不是API中的东西导致问题 - 特别是,它可能是在Uri属性中使用它不是由于某种原因得到支持......
编辑:您是否尝试过设置
query.ExtraParameters = "orderby=starttime";
?这可能是让它进入最终查询的最安全的方式...
答案 1 :(得分:4)
myQuery.ExtraParameters = "orderby=starttime&sortorder=ascending";
像魅力一样!
答案 2 :(得分:1)
对于OP来说可能已经晚了但是我发现这个属性可以对结果进行排序。它可能对某人有所帮助;)
var query = new EventQuery(FEED_URL);
query.SortOrder = CalendarSortOrder.ascending;
答案 3 :(得分: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);
您可以详细了解here。
答案 4 :(得分:0)
要获取日期,我使用Linq查询执行了类似的操作。
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
属性EventQuery
设置为true
也会有所帮助。
答案 5 :(得分: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;
}
}
为我工作。
答案 6 :(得分:0)
您可能还想确保您没有收到已取消的事件,如果您只删除第一次出现的周期性事件,然后删除序列中的其余事件,则会遇到该事件。您删除的序列中的这些剩余事件实际上并未删除,而是将其状态设置为在幕后取消。
在您的代码中不读取这些事件的唯一方法是检查EventEntry的Status属性。