2016-12-08 27 views
5

Mam następujące LINQ do kwerendy do bazy danych i wycofania usuniętych produktów z określonej daty.Porównywanie dat w LINQ nie zwracanie poprawnych wyników

return _myDbEntities.Log 
      .Where(p => p.Action.Equals("Deleted") && 
      (p.ActionDate > fromDate)) 
      .Select(p => new DeletedProduct() 
      { 
       ProductId = p.ProductId, 
       ActionDate = p.ActionDate 
      }).ToList(); 

Jednakże zapytania podczas pobierania wartości, np product.ActionDate.Value = {08.12.2016 11:41:00} gdy FROMData był FROMData = {08.12.2016 11:41: 00 AM}

Zapytanie wyraźnie mówi WIĘKSZE NIŻ. Co tu się dzieje?

+0

Sprawdź ułamek sekundy (lub wyświetl go jako znacznik czasu). Może ta różnica istnieje? –

+2

Jakiego typu jest ActionDate? Czy możesz spróbować (p.ActionDate.Value> fromDate)? –

+0

W zapytaniu używasz 'product.ActionDate', ale tit wydaje Ci się potrzebny' product.ActionDate.Value' – Guy

Odpowiedz

0

Typ DateTime przechowuje czas z dużo większą dokładnością niż sekundy. Mogą się różnić na poziomie milisekundy, a nawet tyknięcia (100 nanosekund).

Jeśli chcesz porównać na wyższym poziomie, spróbuj tego:

(p.ActionDate.Ticks/10000000) > (fromDate.Ticks/10000000) 

Gdzie 10000000 jest liczba kleszczy w drugim. Ponieważ / jest dzielnikiem całkowitym, który obcina frakcję, zmieniasz znaczniki w pełne sekundy.

UPDATE:

Wydaje się, że używasz Entity Framework. Powyższe porównanie prawdopodobnie tam nie zadziała. Rozwiązaniem jest uruchomienie oryginalnego zapytania względem bazy danych, wykonanie ToList, a następnie ponowne przefiltrowanie wyników w kwerendzie LINQ2Objects za pomocą powyższej logiki.

+0

Ty nie ** nie ** chcesz wyciągnąć listę wszystkiego, aby zrobić dodatkowe filtrowanie na nim w pamięci. W zależności od wielkości projektu może to wygenerować wiele dodatkowych danych zwracanych z bazy danych, które następnie muszą zostać przetworzone na obiekty języka C#. Wykorzystaj narzędzia, które posiadasz (SQL Server), i pozwól, że zrobią to za Ciebie. – krillgar

+0

@krillgar: Nie wyciągasz listy wszystkiego. Wyciągasz oryginalny wynik zapytania, który już dokonuje porównania. Drugi filtr służy do filtrowania kilku wyników, w których wartości różnią się tylko na poziomie podsekundowym. – Sefe

+0

OK, źle mnie zrozumiałem. Jeśli OP nie ma możliwości zmiany bazy danych na kolumnę 'datetime2', to by działało. Jeśli jednak mogą wprowadzić tę zmianę, nie trzeba tego robić. – krillgar