2012-10-12 102 views
8

Estoy tratando de consultar el OData utilizando el cliente .net para obtener los componentes Last Published dentro de un DateTime específico. Siempre está fallando con una excepción 'datetime' is not property of entity: 'com.tridion.storage.ComponentMeta'Tridion OData Query con filtro Datetime - error: datetime no es propiedad de la entidad

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

Al revisar la URL Odata construida parece que el siguiente y he intentado con la misma URL desde el navegador simplemente comprobar que tengo el mismo error que se espera.

URL Odata cuando trataba con LINQ

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

me trató mediante la eliminación de la cadena datetime de la URL anterior y se comprueba de nuevo desde el navegador. Esta URL funciona como se esperaba y obtengo los resultados correctos.

A continuación se muestra la URL (de trabajo w/fuera de fecha y hora)

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

Ese tipo de me lleva pensando que algo anda mal con LINQ y/o combinación de cliente .NET.

He intentado jugar con diferentes combinaciones de formato de fecha y hora y me sale el mismo error. Cuando revisé el estándar Odata, sugiero usar la cadena datetime, pero ese es el problema con el que estoy teniendo problemas.

¿Alguien sabe cómo depurar/resolver esto desde el código LINQ? Cualquier ayuda será apreciada.

+0

Abrí un ticket de soporte para lo mismo. Lo publicaré una vez que tenga una actualización. –

+0

Estoy viendo http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption pero todavía no encuentro dónde el estándar OData sugiere usar 'DateTime' ... –

Respuesta

9

Las especificaciones OData se menciona la posibilidad de consultar con construcciones como "LastPublishDate ge datetime'2012-10-11T09: 22: 14' " en http://www.odata.org/documentation/overview#AbstractTypeSystem pero esto no se llevó a cabo en el producto. Sin embargo, en el producto están los métodos de fecha permitidos por las especificaciones de OData para el filtrado (http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption). Estos son los días(), hora(), minutos(), el mes(), segundo() y el año() y esto básicamente se traduce en una consulta pesadilla para usted:

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

Espero que esto ayude.

Saludos, Daniel.

+0

Gracias. +15. El código funcionó perfectamente. Como mencionaste, está construyendo consultas largas :), pero ahora esta es una buena alternativa que puedo usar. Debo ver que a medida que agrego filtros adicionales puede afectar el límite de la cadena de consulta, pero podría manejarlo en el nivel del servidor. –

+0

¿Han encontrado una mejor manera para esto todavía? esta consulta es realmente larga ... – RainCast

0

Probar

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

Gracias. Esto no se parece al problema de la fecha del lado del cliente, está relacionado con cómo el servicio Odata está manejando el datetime en el lado del servidor. Además, VS se queja de que ToString no toma los parámetros sobrecargados con este código. –

Cuestiones relacionadas