Mam dwie wartości dat, jedną już przechowywaną w bazie danych, a drugą wybraną przez użytkownika za pomocą DatePicker. Przypadkiem użycia jest wyszukanie określonej daty w bazie danych.
Wartość wprowadzona wcześniej do bazy zawsze ma składową czasową o godzinie 12:00:00, gdzie jako data wprowadzona z selektora ma inny składnik czasu.
Interesują mnie tylko składniki daty i chciałbym zignorować składnik czasu.
Jakie są sposoby wykonania tego porównania w C #?
Jak to zrobić w LINQ?
AKTUALIZACJA: W LINQ to Entities, poniższe działa dobrze.
e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
Odpowiedzi:
UWAGA: w momencie pisania tej odpowiedzi relacja WF była niejasna (która została dodana do pytania po napisaniu tego). Aby uzyskać prawidłowe podejście z EF, sprawdź odpowiedź Mandeeps .
Możesz użyć tej
DateTime.Date
właściwości, aby przeprowadzić porównanie tylko daty.źródło
EntityFunctions.TruncateTime
pewnością wydaje się, że jest to najlepszy sposób w dzisiejszych czasach (stało się dostępne w .NET 4, który został wydany rok po zadaniu tego pytania).Użyj klasy
EntityFunctions
do przycinania części czasu.Źródło: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
AKTUALIZACJA
Od EF 6,0 i nowszych EntityFunctions jest zastępowane przez DbFunctions .
źródło
EntityFunctions
została wycofana na korzyśćSystem.Data.Entity.DbFunctions
(przynajmniej) EF6. To mogło być wcześniej.Myślę, że to mogłoby ci pomóc.
Zrobiłem rozszerzenie, ponieważ muszę porównać daty w repozytoriach wypełnionych danymi EF, więc .Data nie była opcją, ponieważ nie jest zaimplementowana w tłumaczeniu LinqToEntities.
Oto kod:
wtedy możesz go użyć w ten sposób.
źródło
Jeśli użyjesz tej
Date
właściwości dla jednostek DB, otrzymasz wyjątek:Możesz użyć czegoś takiego:
źródło
Aby to zrobić w LINQ to Entities, musisz użyć obsługiwanych metod :
Brzydkie, ale działa i odbywa się na serwerze DB.
źródło
Oto inny sposób, aby to zrobić, ale jest to przydatne tylko wtedy, gdy SecondDate jest zmienną, którą przekazujesz:
Myślę, że to powinno działać
źródło
DateTime = x.Date;
Brakowało mi tego wyraźnego . Gdybym użyłvar
lub miał wartość wbudowaną w porównaniu, nie powiodło się i zgłosił wyjątek. Dzięki.e.FirstDate.Value <= endDate
nae.FirstDate.Value < endDate
, możesz usunąć.AddTicks(-1)
.Możesz również użyć tego:
DbFunctions.DiffDays(date1, date2) == 0
źródło
możesz użyć do tego metody DbFunctions.TruncateTime ().
źródło
Po prostu zawsze porównuj właściwość Date z DateTime zamiast pełnej daty i godziny.
Kiedy tworzysz zapytanie LINQ, użyj date.Date w zapytaniu, tj .:
źródło
candidate.Date >= base.Date
. Teoretyczniecandidate.Date
czas musi wynosić> = 12:00:00, więc używanie właściwości Date jest zbędne, ale będę trzymać się rady Reeda.Oto jak to robię.
źródło
// Uwaga dla użytkowników / programistów Linq
Powinno to dać ci dokładne porównanie w celu sprawdzenia, czy data mieści się w zakresie podczas pracy z danymi wejściowymi od użytkownika - na przykład:
gdzie data początkowa i data końcowa to wartości z selektora dat.
źródło
Bez czasu spróbuj tak:
źródło
Możesz użyć poniższego linku, aby porównać 2 daty bez czasu:
Funkcja Compare zwraca 3 różne wartości: -1 0 1 co oznacza dt1> dt2, dt1 = dt2, dt1
źródło
Spróbuj tego ... Dobrze jest porównać właściwości Date między dwoma typami DateTimes:
PS. Jest to tymczasowe rozwiązanie i naprawdę zła praktyka, nigdy nie należy jej używać, gdy wiesz, że baza danych może przynieść tysiące rekordów ...
źródło