8

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

構築された Odata URL を確認すると、次のようになります。ブラウザーから同じ URL を使用して再確認しようとしましたが、予想される同じエラーが発生しました。

LINQで試したときのOdata URL

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

datetime上記のURLから文字列を削除して試し、ブラウザから再度確認しました。この URL は期待どおりに機能しており、正しい結果が得られています。

以下はURLです(datetimeなしで機能します)

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

そのようなことから、LINQ や .net クライアントの組み合わせに何か問題があると思います。

さまざまな日時形式の組み合わせで遊んでみましたが、同じエラーが発生します。Odata 標準を確認しdatetimeたところ、文字列を使用することが提案されていますが、それは私が問題を抱えているものです。

LINQコードからこれをデバッグ/解決する方法を知っている人はいますか? どんな助けでも大歓迎です。

4

2 に答える 2

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

お役に立てれば。

よろしく、ダニエル。

于 2012-10-15T06:53:17.837 に答える
0

これを試して

var lastPubComponents = _client.Components
                               .Where(p => p.PublicationId == sitePubId && p.LastPublishDate.ToString("yyyyMMdd") < DateTime.Now.ToString("yyyyMMdd")))
                               .ToList();
于 2012-10-13T04:59:53.043 に答える