带有日期时间过滤器的Tridion OData查询 - 错误:datetime不是实体的属性

Ram*_*m G 8 odata tridion tridion-content-delivery tridion-2011

我试图使用.net客户端查询OData以获取特定DateTime中的Last Published组件.它始终失败,但有例外'datetime' is not property of entity: 'com.tridion.storage.ComponentMeta'

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

当我检查构造的Odata URL时,它看起来像以下,我尝试从浏览器使用相同的URL只是为了仔细检查我得到了相同的错误,这是预期的.

我尝试使用LINQ时的Odata URL

/cd_webservice/odata.svc/Components?$filter=PublicationId eq 59 and LastPublishDate ge datetime'2012-10-11T09:22:14'
Run Code Online (Sandbox Code Playgroud)

我尝试datetime从上面的URL中删除字符串并再次从浏览器中检查.此URL正常工作,我得到了正确的结果.

以下是URL(工作时没有日期时间)

/cd_webservice/odata.svc/Components?$filter=PublicationId eq 59 and LastPublishDate ge '2012-10-11T09:22:14'
Run Code Online (Sandbox Code Playgroud)

这种情况让我觉得LINQ和/或.net客户端组合出了问题.

我尝试使用不同的日期时间格式组合,我得到相同的错误.当我检查Odata标准时,它建议使用datetime字符串,但这是我遇到的问题.

任何人都知道如何从LINQ代码调试/解决这个问题?任何帮助将不胜感激.

Dan*_*agu 9

OData规范确实提到了在http://www.odata.org/documentation/overview#AbstractTypeSystem中使用像"LastPublishDate ge datetime'2012-10-11T09:22:14"这样的结构进行查询的可能性, 但这并没有实现到产品.但是,在产品中是OData规范允许过滤的日期方法(http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption).这些是day(),hour(),minute(),month(),second()和year(),这基本上会转化为一个噩梦般的查询:

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();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

问候,丹尼尔.