2012-08-16 30 views
5

Używam EF 4, mam nieruchomość DateTimeStart w moich podmiotach z datą w tym formacie 16/08/2012 08:14:40, chciałbym zapytanie z EF i znaleźć wszystkie podmioty within the date 16/08/2012 only. Za pomocą tego kodu poniżej kodu otrzymuję ten błądEF jak filtrować dane według daty

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported. 

mój kod

DateTime dateTimeNow = DateTime.UtcNow; 
     DateTime dateNow = dateTimeNow.Date; 
     return db.EventCustoms.Where(x => x.DataTimeStart.Date <= dateNow) 
      .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart }); 
+0

Jaki typ danych jest DataTimeStart? – podiluska

+0

System.DateTime – GibboK

Odpowiedz

5
DateTime dateTimeNow = DateTime.UtcNow; 
DateTime dateTomorrow = dateTimeNow.Date.AddDays(1); 
return db.EventCustoms.Where(x => x.DataTimeStart < dateTomorrow) 
      .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart }); 

[Edytuj] @GibboK, opracowanie bitowe:

Entity Framework nie można przetłumaczyć właściwości Date na obiekcie DateTime w bazie danych bok.

wyboru są następujące opcje:

(1) (jak wyżej) do przemyślenia zapytanie i spróbuj na rozwiązanie, które nie wymaga wywołania funkcji po stronie bazy danych dla każdego wiersza w tabeli .... co jest dobre dla wydajności zapytań zbyt

(2) lub jeżeli nie jest to możliwe, można skorzystać z klasy EntityFunctions, co naraża metod (takich jak TruncateTime), które może być tłumaczone przez EF do odpowiedniego rodem funkcja dla podstawowego źródła danych.

np.

return db.EventCustoms 
    .Where(x => EntityFunctions.TruncateTime(x.DataTimeStart) <= dateNow) 
+0

działa dzięki! – GibboK

+1

Podczas realizacji tej odpowiedzi odkryłem, że 'System.Data.Entity.Core.Objects.EntityFunctions' jest przestarzałe i powinno zostać zastąpione przez' System.Data.Entity.DbFunctions'. Ta sama metoda TruncateTime() istnieje w nowej przestrzeni nazw/klasie, więc wystarczy zmienić 'EntityFunctions' na' DbFunctions', a dodanie poprawnej instrukcji użycia powinno dobrze działać dla przyszłych użytkowników tej odpowiedzi. – andrewcbancroft

+0

Należy jednak pamiętać, w jakim języku SQL zostanie to przetłumaczone. Jest to coś w rodzaju '((convert (datetime2, convert (varchar (255), [Filter1]. [DateTimeStart], 102), 102)) <= '2017-01-13 00: 00: 00''- więc ja myślę, że pójdę z wersją 'dateTomorrow', ponieważ nie będzie to wymagać żadnej konwersji w DB na poziomie wiersza. – Gerwald

3
DateTime dateTimeNow = DateTime.UtcNow; 
     DateTime dateNow = dateTimeNow.Date; 
     return db.EventCustoms.Where(
      x => EntityFunctions.DiffDays(x.DataTimeStart, dateNow) >= 0) 
      .Select(y => new { y.EventId, y.EventTitle, y.DataTimeStart }); 
+0

Witam Amiram Korach, niestety nie działa, proszę spojrzeć i dać mi znać? wielkie dzięki za twój czas. – GibboK

+0

Przepraszam za mój błąd. Powinno to być "> =". Ta metoda daje liczbę dodatnią, jeśli pierwsza wartość jest mniejsza niż druga. –

0

W EF 6:

using System.Data.Entity; 
... 
db.EventCustoms.Where(x => 
DbFunctions.TruncateTime(x.DataTimeStart) <= DbFunctions.TruncateTime(dateNow))