带有Datetime筛选器的Tridion OData查询-错误:Datetime不是实体的属性

带有Datetime筛选器的Tridion OData查询-错误:Datetime不是实体的属性,odata,tridion,tridion-2011,tridion-content-delivery,Odata,Tridion,Tridion 2011,Tridion Content Delivery,我试图使用.net客户端查询OData,以获取特定日期时间内最后发布的组件。它总是失败,出现一个异常“datetime”不是实体的属性:“com.tridion.storage.ComponentMeta” var lastPubComponents = _client.Components .Where(p => p.PublicationId == sitePubId && p.LastPublishDate

我试图使用.net客户端查询OData,以获取特定日期时间内最后发布的组件。它总是失败,出现一个异常
“datetime”不是实体的属性:“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();
当我检查构建的ODataURL时,它看起来像下面这样,我尝试从浏览器中使用相同的URL只是为了再次检查,我得到了预期的相同错误

我尝试使用LINQ时的Odata URL

/cd_webservice/odata.svc/Components?$filter=PublicationId eq 59 and LastPublishDate ge datetime'2012-10-11T09:22:14'
我试图从上面的URL中删除
datetime
字符串,并再次从浏览器中进行检查。此URL按预期工作,我得到了正确的结果

下面是URL(工作时带日期时间)

这让我觉得LINQ和/或.net客户端组合有问题

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

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

试试这个

var lastPubComponents = _client.Components
                               .Where(p => p.PublicationId == sitePubId && p.LastPublishDate.ToString("yyyyMMdd") < DateTime.Now.ToString("yyyyMMdd")))
                               .ToList();
var lastPubComponents=\u client.Components
其中(p=>p.PublicationId==sitePubId&&p.LastPublishDate.ToString(“yyyyMMdd”)
OData规范确实提到了使用中的“LastPublishDate ge datetime'2012-10-11T09:22:14'”之类的结构进行查询的可能性,但这并未在产品中实现。但是,在产品中有OData规范允许用于筛选()的日期方法。它们是日()、小时()、分钟()、月()、秒()和年(),这基本上转化为一个噩梦查询:

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();
希望这有帮助

问候,,
丹尼尔。

我为同样的问题开了一张支持票。我会在更新后发布。我正在查看,但我仍然没有找到OData标准建议在哪里使用“DateTime”…谢谢。这看起来不像客户端的日期时间问题,它与Odata服务如何在服务器端处理日期时间有关。另外,VS抱怨ToString没有在代码中使用重载参数。谢谢+15代码运行得很好。正如您提到的,它正在构建长查询:),但现在这是我可以使用的一个很好的替代方法。当我添加额外的过滤器时,我需要查看它是否会达到查询字符串限制,但我可以在服务器级别处理它。
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();