C# .NET Google日历API按日期对事件排序

C# .NET Google日历API按日期对事件排序,c#,asp.net,.net,google-calendar-api,C#,Asp.net,.net,Google Calendar Api,几天来,我一直在阅读文档并使用不同的EventQuery参数。我正在使用C#NET和谷歌的.NETAPI从我设置的公共日历中获取事件。我可以从api中很好地获取事件,但我无法让它在日期之前为我提供下一个即将到来的事件。我的日历混合了重复事件和一次性事件。我在互联网上读过一些关于在请求uri中使用直接查询参数字符串的文章,但在.NETAPI结构中使用它时,似乎无法正常工作。以下是我目前的基本情况: CalendarService myService = new CalendarService("t

几天来,我一直在阅读文档并使用不同的EventQuery参数。我正在使用C#NET和谷歌的.NETAPI从我设置的公共日历中获取事件。我可以从api中很好地获取事件,但我无法让它在日期之前为我提供下一个即将到来的事件。我的日历混合了重复事件和一次性事件。我在互联网上读过一些关于在请求uri中使用直接查询参数字符串的文章,但在.NETAPI结构中使用它时,似乎无法正常工作。以下是我目前的基本情况:

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);
}            
CalendarService myService=newcalendarservice(“testGoogleCalendar-1”);
EventQuery myQuery=新建EventQuery();
Uri=newURI(CalendarURI);
myQuery.NumberToRetrieve=NumberOfEvents;
EventFeed calFeed=myService.Query(myQuery);
foreach(calFeed.Entries中的原子条目)
{
LiteralControl测试=新的LiteralControl(“”+entry.Title.Text+“

”); 本.控件.添加(测试); }
我尝试过使用EventQuery的成员StartDate、StartTime、EndTime、SortOrder、FutureEvents,甚至尝试过向CalendarURI本地成员添加“?orderby=StartTime”

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

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


这一条现在真的让我感到困惑,所以非常感谢您的帮助。

这是谷歌文档中关于日历API的内容:

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

EventFeed myResultsFeed = myService.Query(myQuery);

您可以阅读更多信息。

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

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

编辑:你试过设置吗

query.ExtraParameters = "orderby=starttime";
??这可能是将其放入最终查询uri的最安全的方法

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

工作起来很有魅力

为了得到日期,我用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);
}
此外,将
EventQuery
上的
SingleEvent
属性设置为
true
也会有所帮助。

EventQuery query=neweventquery();
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;
    }
}
query.Uri=新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(查询); 列表项=新列表(); foreach(calFeed.Entries中的var条目) { EventEntry EventEntry=输入为Google.GData.Calendar.EventEntry; if(eventEntry!=null) { if(eventEntry.Times.Count!=0) { DateTime dt=eventEntry.Times[0].StartTime; } }

为我工作。

您最好确保您没有收到取消的事件,如果您仅删除第一次重复事件,然后删除序列中的剩余事件,则可能会遇到取消的事件。您删除的序列中的这些剩余事件实际上并没有被删除,而是eir状态设置为在幕后取消


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

操作可能已经晚了,但我发现这个属性可以对结果进行排序。它可能对某些人有所帮助;)


但这并不是按日期对事件进行排序。是的,它会给你该日期时间内的事件,但它们是以某种随机顺序排列的。如果我能找到一种方法来获取事件的发生日期,并在必要时自行排序,我会很好。谢谢。我必须同意Jon的观点,orderby=StartTime似乎应该有效。你有没有想过ed it?是和否;我在a broswer测试中将其附加到uri时使用过它,但它可以向后排序。如果我将其放在api代码中使用的uri中,则它根本不起作用。Orderby的EventQuery对象也没有成员,但SortOrder的EventQuery对象中有一个成员;但这对我也没有帮助它是由发布日期或其他东西分类的。我注意到在来自谷歌的日历演示代码中,他们使用的是EventEntry,而不是AtomEntry,该AtomEntry有一个Times成员,类型为When。但我使用了它,并且在调试器模式下,我的所有对象都有一个null Times成员。我确实认为我有一些东西。如果我把原始的我在浏览器中使用该查询字符串,它返回正常,但从大多数未来事件到当前事件进行排序。他们建议使用另一个参数sortorder=升序,但这甚至会破坏浏览器测试。这里似乎有很多功能,但现在有一种方法可以利用它!谢谢我将继续查找Eric-请参阅我的编辑;我怀疑添加额外的参数查询字符串右边的r是正确的方法。当你说你的所有对象都有一个null Times成员时-它们是单个事件,还是重复发生的?我刚刚捕获了你的编辑,它工作了!!!当我读到关于extraparameters的内容时,它们听起来像我的自定义键值对,我可以存储在日历中。作为对你的单个或重复事件的响应
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;
    }
}
var query = new EventQuery(FEED_URL);    
query.SortOrder = CalendarSortOrder.ascending;