2012-08-16 3 views
5

I 'utilizzando EF 4, ho una proprietà DateTimeStart nelle mie entità con data in questo formato 16/08/2012 08:14:40, vorrei interrogare con EF e trovare tutte le entità within the date 16/08/2012 only. L'utilizzo di questo codice sotto il codice Ricevo questo erroreEF come filtrare i dati per data

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

mio codice

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

Che tipo di dati è il DataTimeStart? – podiluska

+0

System.DateTime – GibboK

risposta

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 }); 

[Edit] @GibboK, di elaborare un po ':

Entity Framework non è in grado di tradurre la proprietà Date nell'oggetto DateTime nel database lato.

Le opzioni disponibili sono:

(1) (come sopra) per ripensare la query e provare per una soluzione che non richiede una chiamata di funzione a lato del database per ogni riga della tabella .... che è buono per le prestazioni delle query troppo

(2) o, se ciò non è possibile, si può fare uso della classe EntityFunctions, che espone i metodi (come ad esempio TruncateTime) che può essere tradotto da EF nella nativa appropriata funzione per l'origine dati sottostante.

ad es.

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

funziona molte grazie! – GibboK

+1

Mentre implementavo questa risposta oggi, ho scoperto che 'System.Data.Entity.Core.Objects.EntityFunctions' è deprecato e dovrebbe essere sostituito da' System.Data.Entity.DbFunctions'. Lo stesso metodo TruncateTime() esiste nel nuovo spazio dei nomi/classe, quindi è sufficiente modificare 'EntityFunctions' in' DbFunctions' e aggiungere l'istruzione using corretta dovrebbe funzionare bene per gli utenti futuri di questa risposta. – andrewcbancroft

+0

Ma attenzione, in quale dichiarazione SQL questo verrà tradotto. È qualcosa come '((convert (datetime2, convert (varchar (255), [Filter1]. [DateTimeStart], 102), 102)) <= '2017-01-13 00: 00: 00''- quindi I penso che andrò con la versione di 'dateTomorrow', in quanto non ci sarà bisogno di alcuna conversione nel DB a livello di riga. – 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

ciao Amiram Korach, sfortunatamente non funziona, potresti darci un'occhiata e fammi sapere? molte grazie per il tuo tempo – GibboK

+0

Scusate il mio errore. Dovrebbe essere "> =". Questo metodo ti darà un numero positivo se il primo valore è minore del secondo. –

0

In EF 6:

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