2012-10-12 11 views
8

Sto provando a interrogare OData utilizzando il client .net per ottenere i componenti dell'ultima pubblicazione in un determinato DateTime. E 'sempre fallendo con un'eccezione 'datetime' is not property of entity: 'com.tridion.storage.ComponentMeta'Tridion OData Query con filtro Datetime - errore: datetime non è una proprietà dell'Enità

var lastPubComponents = _client.Components 
           .Where(p => p.PublicationId == sitePubId && p.LastPublishDate > Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-ddThh:mm:ss"))) 
           .ToList(); 

Quando ho controllato l'URL odata costruito sembra che la segue e ho provato con lo stesso URL dal browser solo per il doppio controllo ho ottenuto lo stesso errore che si prevede.

odata URL quando ho provato con LINQ

/cd_webservice/odata.svc/Components?$filter=PublicationId eq 59 and LastPublishDate ge datetime'2012-10-11T09:22:14' 

ho provato rimuovendo la stringa datetime dall'URL sopra e controllati dal browser di nuovo. Questo URL funziona come previsto e sto ottenendo i risultati corretti.

Di seguito si riporta l'URL (lavoro w/out datetime)

/cd_webservice/odata.svc/Components?$filter=PublicationId eq 59 and LastPublishDate ge '2012-10-11T09:22:14' 

Questo tipo di mi porta a pensare che sia qualcosa di sbagliato con LINQ e/o combinazione di client .NET.

Ho provato a giocare con diverse combinazioni di formato Datetime e ottengo lo stesso errore. Quando ho controllato lo standard Odata, suggerisco di usare la stringa datetime ma è quello con cui sto avendo problemi.

Qualcuno sa come eseguire il debug/risolvere questo dal codice LINQ? Qualsiasi aiuto sarà molto apprezzato.

+0

Ho aperto un ticket di supporto per lo stesso. Pubblicheremo una volta che avrò un aggiornamento. –

+0

Sto guardando http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption ma non trovo ancora dove lo standard OData suggerisce di usare "DateTime" ... –

risposta

9

Le specifiche OData fanno parlare della possibilità di interrogare con costrutti come "LastPublishDate ge datetime'2012-10-11T09: 22: 14' " in http://www.odata.org/documentation/overview#AbstractTypeSystem, ma questo non è stato attuato nel Prodotto. Tuttavia, nel prodotto sono i metodi di data consentiti dalle specifiche OData per il filtro (http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption). Questi sono giorni(), ora(), minuti(), il mese(), secondo() e l'anno() e questo si traduce in pratica in una query incubo per voi:

DateTime timeNow = DateTime.Now; 
int yearNow = timeNow.Year; 
int monthNow = timeNow.Month; 
int dayNow = timeNow.Day; 
int hourNow = timeNow.Hour; 
int minuteNow = timeNow.Minute; 
int secondNow = timeNow.Second; 
var lastPubComponents = service.Components 
    .Where(p => p.PublicationId == 3 && 
      (p.LastPublishDate.Value.Year > yearNow || 
       (p.LastPublishDate.Value.Year == yearNow && p.LastPublishDate.Value.Month > monthNow) || 
       (p.LastPublishDate.Value.Year == yearNow && p.LastPublishDate.Value.Month == monthNow && p.LastPublishDate.Value.Day > dayNow) || 
       (p.LastPublishDate.Value.Year == yearNow && p.LastPublishDate.Value.Month == monthNow && p.LastPublishDate.Value.Day == dayNow && p.LastPublishDate.Value.Hour > hourNow) || 
       (p.LastPublishDate.Value.Year == yearNow && p.LastPublishDate.Value.Month == monthNow && p.LastPublishDate.Value.Day == dayNow && p.LastPublishDate.Value.Hour == hourNow && p.LastPublishDate.Value.Minute > minuteNow) || 
       (p.LastPublishDate.Value.Year == yearNow && p.LastPublishDate.Value.Month == monthNow && p.LastPublishDate.Value.Day == dayNow && p.LastPublishDate.Value.Hour == hourNow && p.LastPublishDate.Value.Minute == minuteNow && p.LastPublishDate.Value.Second > secondNow) 
      ) 
      ) 
    .ToList(); 

Spero che questo aiuti.

Cordiali saluti, Daniel.

+0

Grazie. +15. Il codice ha funzionato perfettamente. Come hai detto, sta costruendo una lunga query :), ma al momento questa è una buona alternativa che posso usare. Devo vedere come aggiungo ulteriori filtri se potrebbe raggiungere il limite della stringa di query, ma potrei gestirlo a livello del server. –

+0

Avete già trovato un modo migliore per farlo? questa query è davvero lunga ... – RainCast

0

Prova!

var lastPubComponents = _client.Components 
           .Where(p => p.PublicationId == sitePubId && p.LastPublishDate.ToString("yyyyMMdd") < DateTime.Now.ToString("yyyyMMdd"))) 
           .ToList(); 
+0

Grazie. Questo non sembra un problema datetime lato client, è correlato al modo in cui il servizio Odata gestisce il datetime sul lato server. Inoltre, VS lamenta che ToString non accetta parametri sovraccarichi con questo codice. –