2012-10-12 2 views
8

Ich versuche, das OData mit .NET-Client abzufragen, um die Last Published-Komponenten innerhalb einer bestimmten DateTime zu erhalten. Es versagt immer mit einer Ausnahme 'datetime' is not property of entity: 'com.tridion.storage.ComponentMeta'Tridion OData Abfrage mit Datetime-Filter - Fehler: Datetime ist keine Eigenschaft der Entität

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

Wenn ich die konstruierte OData URL überprüft es wie folgt aussieht und ich versuchte, mit der gleichen URL von Browser ich nur zu verdoppeln überprüfen Sie die gleiche Fehlermeldung anzeigt, die erwartet wird.

OData URL, wenn ich mit LINQ versucht

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

Ich habe versucht, durch die datetime Zeichenfolge aus der oben genannten URL zu entfernen und wieder von Browser geprüft. Diese URL funktioniert wie erwartet und ich bekomme die richtigen Ergebnisse.

Im Folgenden finden Sie die URL (Arbeits w/out Datetime)

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

Diese Art von mir führt denken, es ist etwas falsch mit LINQ und/oder .net-Client-Kombination ist.

Ich habe versucht, mit verschiedenen Datetime-Format-Kombinationen zu spielen, und ich bekomme den gleichen Fehler. Als ich den Odata-Standard überprüfte, schlug ich vor, datetime string zu verwenden, aber das ist derjenige, mit dem ich Probleme habe.

Kann jemand dieses vom LINQ-Code debuggen/auflösen? Jede Hilfe wird sehr geschätzt.

+0

Ich öffnete ein Support-Ticket für die gleiche. Wird es veröffentlichen, sobald ich ein Update habe. –

+0

Ich schaue auf http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption, aber ich finde immer noch nicht, wo der OData-Standard vorschlägt, 'DateTime' zu verwenden ... –

Antwort

9

Die OData-Spezifikationen nennen tun die Möglichkeit, mit Konstrukten wie die Abfrage "LastPublishDate ge datetime'2012-10-11T09: 22: 14' " in http://www.odata.org/documentation/overview#AbstractTypeSystem aber dies wurde nicht in die Umsetzung Produkt. Im Produkt sind jedoch die von OData-Spezifikationen für das Filtern zulässigen Datumsmethoden (http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption). Dies sind Tag(), Stunde(), Minute(), Monat(), zweite() und Jahr() und dies führt im Grunde in einen Alptraum Abfrage für Sie:

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

Hoffnung, das hilft.

Grüße, Daniel.

+0

Danke. +15. Der Code hat perfekt funktioniert. Wie du schon erwähntest, baut es lange Abfragen auf :), aber im Moment ist dies eine gute Alternative, die ich nutzen kann. Ich muss sehen, wie ich zusätzliche Filter hinzufüge, ob es das Query-Zeichenfolgenlimit treffen könnte, aber ich konnte damit umgehen, kann auf der Server-Ebene sein. –

+0

Habt ihr schon einen besseren Weg gefunden? Diese Abfrage ist wirklich lang ... – RainCast

0

Versuchen Sie, diese

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

Danke. Dies sieht nicht wie ein clientseitiges Datetime-Problem aus, sondern hängt davon ab, wie der Odata-Service die Datetime auf der Serverseite behandelt. VS beschwert sich darüber, dass ToString mit diesem Code keine überladenen Parameter übernimmt. –

Verwandte Themen