Używając tego kodu w Entity Framework otrzymuję następujący błąd. Muszę uzyskać wszystkie wiersze dla określonej daty, DateTimeStart
jest typu DataType w tym formacie2013-01-30 12:00:00.000
Kod:
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => x.DateTimeStart.Date == currentDateTime.Date);
Błąd:
base {System.SystemException} = {"Element członkowski określonego typu 'Date' nie jest obsługiwany w LINQ to Entities. Obsługiwane są tylko inicjatory, elementy członkowskie jednostki i właściwości nawigacji po jednostkach."}
Jakieś pomysły, jak to naprawić?
Odpowiedzi:
DateTime.Date
nie można przekonwertować na SQL. Użyj metody EntityFunctions.TruncateTime , aby pobrać część daty.AKTUALIZACJA: Jak wspomniano w komentarzach @shankbond, w Entity Framework 6
EntityFunctions
jest przestarzały i należy używaćDbFunctions
klasy, która jest dostarczana z Entity Framework.źródło
Powinieneś teraz użyć
DbFunctions.TruncateTime
źródło
Chciałbym dodać rozwiązanie, które pomogło mi rozwiązać ten problem we frameworku podmiotowym:
Mam nadzieję, że to pomoże.
źródło
EntityFunctions
jest przestarzały. Rozważ użycieDbFunctions
zamiast tego.źródło
Zawsze używaj EntityFunctions.TruncateTime () zarówno dla x.DateTimeStart, jak i currentDate. Jak na przykład :
źródło
Po prostu użyj prostych właściwości.
Jeśli przyszłe daty nie są możliwe w Twojej aplikacji, wystarczy > = x.DateTimeStart> = currentDateTime.Date .
jeśli masz bardziej złożone porównania dat, sprawdź Funkcje kanoniczne i jeśli masz funkcje EF6 + DB
Bardziej ogólnie - dla osób szukających problemów Obsługiwane metody Linq w EF mogą wyjaśnić podobne problemy z instrukcjami linq, które działają na listach bazowych pamięci, ale nie w EF.
źródło
Uproszczony:
źródło
Użyj poniższego kodu do korzystania z EF6:
źródło
Innym rozwiązaniem mogłoby być:
źródło