2012-05-07 8 views
7

Próbuję znaleźć wszystkie dokumenty, które zostały utworzone w określonym czasie. Używam C# i sterownika mongodb C#.MongoDB i DateTimeOffset typu

Moja jednostka jest w następujący sposób:

public class Entity 
{ 
    public Gid Id { get; private set; } 
    public DateTimeOffset CreationTimestamp { get; private set; } 
    public Entity() 
    { 
    } 
} 

Pomyślałem więc mogę to zrobić:

DateTime compareTime = DateTime.UtcNow.AddMinutes(-15); 
var result = _collection.Find(Query.GT("CreationTimestamp", compareTime)).Count(); 

Wynik to liczba zero, mimo że nie ma danych w zbiorze. Jeśli zmienię z DateTimeOffset na DateTime, otrzymam wynik.

Czy problem ten typ datetimeoffset nie jest obsługiwany? Jeśli tak, istnieje sposób obejścia tego, ponieważ potrzebuję moje podmioty do korzystania z DateTimeOffset?

+0

Zaktualizowano DateTime.Now.AddMinutes (-15); do DateTime.UtcNow.AddMinutes (-15); – Noel

Odpowiedz

11

datetimeoffset nie odcinkach jak data w ogóle, ale (domyślnie), a tablica [kleszcze strefy czasowej]. W związku z tym nie można przesyłać zapytań w ten sam sposób, w jaki zwykłą datę. Zamiast tego będziemy wyszukiwać w oparciu o ticks. Musisz upewnić się, że przesunięcia stref czasowych są takie same, w przeciwnym razie to nie zadziała.

DateTimeOffsett compareTime = DateTimeOffsett.UtcNow.AddMinutes(-15); 
var result = _collection.Find(Query.GT("CreationTimestamp.0", compareTime.Ticks)).Count(); 

Zasadniczo mamy zamiar porównać pierwszy element tablicy przechowywanej z liczby kleszczy. Ponownie przepraszam za czas potrzebny na uzyskanie tej odpowiedzi.

+0

Craig, Kiedy używam FindAll() mój CreationTimestamp pobrany z mojego dokumentu to {07/05/2012 16:39:20 +01: 00}. Kiedy robię Query.GT ("CreationTimestamp", compareTime) .ToJson(); moja wartość to "{\" CreationTimestamp \ ": {\" $ gt \ ": ISODate (\" 2012-05-07T15: 24: 29.037Z \ ")}}" Tak więc oczekiwałbym, że zwróci dokument – Noel

+0

Tak Muszę użyć DateTimeOffset – Noel

+0

OK, zaktualizowałem odpowiedź. –