2012-10-12 10 views
8

Próbuję wysłać zapytanie do OData za pomocą klienta .net, aby uzyskać składniki Last Published w określonym dniu DateTime. To jest zawsze niepowodzeniem z wyjątkiem 'datetime' is not property of entity: 'com.tridion.storage.ComponentMeta'Tridion OData Query z filtrem Datetime - error: datetime nie jest własnością Entity

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

Po sprawdzeniu konstruowanej OData URL wygląda na to, co następuje, a ja próbowałem z tego samego adresu URL z przeglądarki tak, aby dokładnie sprawdzić Mam ten sam błąd, który jest oczekiwany.

OData URL gdy próbowałem z LINQ

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

Próbowałem usuwając łańcuch z powyższego adresu URL datetime i sprawdzone od przeglądarce ponownie. Ten URL działa zgodnie z oczekiwaniami i uzyskuję poprawne wyniki.

Poniżej znajduje się adres URL (pracuje w/out datetime)

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

Tego rodzaju prowadzi mnie myśląc, że jest coś nie tak z LINQ i/lub kombinacji klienckim .NET.

Próbowałem grać z różnymi kombinacjami formatów Datetime i otrzymuję ten sam błąd. Kiedy sprawdziłem standard Odata sugeruję użyć ciągu znaków datetime, ale to jest ten, z którym mam problemy.

Ktoś wie, jak debugować/rozwiązać ten problem z kodu LINQ? Każda pomoc zostanie bardzo doceniona.

+0

Otworzyłem bilet wsparcia dla tego samego. Opublikuję go po otrzymaniu aktualizacji. –

+0

Patrzę na http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption, ale nadal nie wiem, gdzie standard OData sugeruje użycie "DateTime" ... –

Odpowiedz

9

Specyfikacje OData zrobić wspomnieć możliwość frazę konstruktów jak "LastPublishDate ge datetime'2012-10-11T09: 22: 14' " w http://www.odata.org/documentation/overview#AbstractTypeSystem ale nie zostało to wprowadzone do produkt. Jednak w produkcie są metody daty dozwolone przez specyfikacje OData do filtrowania (http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption). Są dni(), godzina(), minuty(), miesiąc(), drugi() i rok(), a to przekłada się na zasadzie zapytania koszmar dla Ciebie:

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

Nadzieja to pomaga.

Pozdrawiam, Daniel.

+0

Dziękuję. +15. Kod działał idealnie. Jak już wspomniałeś, buduje długie zapytanie :), ale teraz jest to dobra alternatywa, z której mogę korzystać. Muszę zobaczyć, jak dodam dodatkowe filtry, czy może trafić limit ciągu zapytania, ale mogę obsłużyć, które mogą być na poziomie serwera. –

+0

Znaleźliście jeszcze lepszy sposób na to? to zapytanie jest naprawdę długie ... – RainCast

0

Spróbuj tego

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

Dziękuję. To nie wygląda na problem związany z datetime po stronie klienta, ale jest związany z tym, jak usługa Odata obsługuje datetime po stronie serwera. Ponadto VS narzeka, że ​​ToString nie przejmuje przeciążonych parametrów tym kodem. –