2012-10-12 31 views
8

Tôi đang cố truy vấn OData bằng cách sử dụng máy khách .net để lấy các thành phần được xuất bản lần cuối trong một DateTime cụ thể. Nó luôn luôn là không có một ngoại lệ 'datetime' is not property of entity: 'com.tridion.storage.ComponentMeta'Tridion OData Query với bộ lọc ngày giờ - lỗi: datetime không phải là thuộc tính của Entity

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

Khi tôi kiểm tra URL OData xây dựng nó trông giống như sau và tôi đã cố gắng với cùng một URL từ trình duyệt chỉ để kiểm tra tôi đã nhận lỗi cùng dự kiến ​​sẽ tăng gấp đôi.

URL OData khi tôi thử với LINQ

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

tôi đã cố gắng bằng cách loại bỏ các datetime chuỗi từ URL ở trên và kiểm tra từ trình duyệt một lần nữa. URL này hoạt động như mong đợi và tôi nhận được kết quả chính xác.

Dưới đây là URL (làm việc w/out datetime)

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

Đó là loại dẫn tôi nghĩ nó là một cái gì đó sai với LINQ và/hoặc kết hợp khách hàng .net.

Tôi đã thử phát các kết hợp định dạng Ngày giờ khác nhau và tôi gặp lỗi tương tự. Khi tôi kiểm tra tiêu chuẩn Odata, nó gợi ý sử dụng chuỗi datetime nhưng đó là chuỗi tôi đang gặp phải sự cố.

Bất kỳ ai biết cách gỡ lỗi/giải quyết vấn đề này khỏi mã LINQ? Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào.

+0

Tôi đã mở một vé hỗ trợ cho tương tự. Sẽ đăng nó sau khi tôi có một bản cập nhật. –

+0

Tôi đang xem http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption nhưng tôi vẫn không tìm thấy tiêu chuẩn OData đề xuất sử dụng 'DateTime' ... –

Trả lời

9

Các thông số kỹ thuật OData làm đề cập đến khả năng truy vấn với các cấu trúc như "LastPublishDate ge datetime'2012-10-11T09: 22: 14' " trong http://www.odata.org/documentation/overview#AbstractTypeSystem nhưng điều này đã không được thực hiện vào sản phẩm. Tuy nhiên, trong sản phẩm là các phương pháp ngày được cho phép bởi thông số kỹ thuật OData để lọc (http://www.odata.org/documentation/uri-conventions#FilterSystemQueryOption). Đây là những ngày(), giờ(), phút(), tháng(), thứ hai() và năm() và điều này về cơ bản chuyển thành một cơn ác mộng truy vấn cho bạn:

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

Hope this helps.

Trân trọng, Daniel.

+0

Cảm ơn bạn. +15. Mã hoạt động hoàn hảo. Như bạn đã đề cập nó là xây dựng truy vấn dài :), nhưng ngay bây giờ đây là một lựa chọn tốt tôi có thể sử dụng. Tôi cần phải xem như tôi thêm các bộ lọc bổ sung cho dù nó có thể nhấn giới hạn chuỗi truy vấn nhưng tôi có thể xử lý mà có thể ở cấp độ máy chủ. –

+0

Các bạn đã tìm ra cách tốt hơn cho điều này chưa? truy vấn này thực sự dài ... – RainCast

0

Hãy thử điều này

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

Cảm ơn bạn. Điều này không giống như vấn đề datetime phía máy khách, nó có liên quan Cách dịch vụ Odata đang xử lý datetime ở phía máy chủ. Ngoài ra, VS phàn nàn rằng ToString không nhận các tham số quá tải với mã này. –

Các vấn đề liên quan