Domanda

Ho letto i documenti e giocato con diversi parametri EventQuery da giorni. Sto usando C # .NET con .net api di google per ottenere gli eventi da un calendario pubblico che ho impostato. Posso ottenere gli eventi dall'API bene, ma non riesco a darmi i prossimi eventi in scadenza per data. Il mio calendario ha mescolato eventi di ricorrenza con eventi one-shot. Ho letto cose su Internet per usare stringhe di parametri di query diretta nell'uri richiesta ma non sembra funzionare correttamente quando lo si utilizza nella struttura API .net. Ecco quello che ho attualmente come base:

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);
}            

Ho provato a giocare con i membri di EventQuery StartDate, StartTime, EndTime, SortOrder, FutureEvents e ho anche provato ad aggiungere "? orderby = starttime " al membro locale CalendarURI.

La query API sembra restituire l'ordine della data pubblicata dell'evento che è quando ho creato l'evento nel calendario e non quando si svolgerà l'evento.

Ho anche cercato di ottenere solo la data e l'ora dell'evento dall'oggetto AtomEntry in modo da poterlo ordinare da solo e formattarlo con il titolo nel mio controllo, ma l'unico posto che vedo è nel contenuto di AtomEntry. che ha anche altre cose che non voglio davvero. Esiste un membro DateTime di AtomEntry per questo in modo che io possa semplicemente ottenere la data?

Questo mi ha davvero confuso in questo momento, quindi ogni aiuto è apprezzato.

È stato utile?

Soluzione

Non ho usato l'API del calendario GData da .NET, ma ne ho abbastanza familiarità con Java. L'ora di inizio di un evento dipenderà dal tipo di evento. Un evento ricorrente non ha orari di inizio come tali, ma un & Quot; singolo & Quot; l'evento potrebbe effettivamente avere più volte. Questi sono memorizzati come <gd:when> elementi: ecco cosa devi cercare.

Sembra che orderby=starttime davvero dovrebbe funzionare però. Potrebbe valere la pena usare WireShark o qualcosa di simile per vedere l'esatta query che esce e i risultati esatti che ritornano, per verificare che non sia qualcosa nell'API che causa problemi - in particolare, potrebbe essere che l'uso di quello nella proprietà Uri non lo sia supportato per qualche motivo ...

EDIT: hai provato a impostare

query.ExtraParameters = "orderby=starttime";

? Questo è probabilmente il modo più sicuro per inserirlo nella query finale uri ...

Altri suggerimenti

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

Funziona come un fascino!

Forse è tardi per l'OP ma ho trovato questa proprietà che ordina il risultato. Potrebbe forse aiutare qualcuno;)

var query = new EventQuery(FEED_URL);    
query.SortOrder = CalendarSortOrder.ascending;

Questo era sui documenti di Google per l'API del calendario:

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

EventFeed myResultsFeed = myService.Query(myQuery);

Puoi leggere di più al riguardo qui .

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;
    }
}

Ha funzionato per me.

Per ottenere la data ho fatto una cosa del genere con una query 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);
}

Se hai eventi ricorrenti potresti dover guardare facendo qualcosa del genere:

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

Inoltre, sarà utile impostare la proprietà SingleEvent su EventQuery su true.

Puoi anche assicurarti di non ricevere un evento annullato, che puoi riscontrare se elimini solo la prima occorrenza di un evento ricorrente e successivamente elimini gli eventi rimanenti nella sequenza. Questi eventi rimanenti nella sequenza che hai eliminato non sono stati effettivamente eliminati, ma il loro stato è stato impostato per annullarsi dietro le quinte.

L'unico modo per non leggere questi eventi nel tuo codice sarebbe quello di controllare la proprietà Status di EventEntry.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top