Come posso eseguire il confronto delle date nella query EF?

Per favore aiuto. Sto cercando di capire come utilizzare DATE o DATETIME per il confronto in una query linq.

Esempio: se volessi tutti i nomi dei dipendenti per quelli che erano iniziati prima di oggi, farei qualcosa di simile in SQL:

SELECT EmployeeNameColumn FROM EmployeeTable WHERE StartDateColumn.Date <= GETDATE() //Today 

Ma per quanto riguarda linq?

 DateTime startDT = //Today var EmployeeName = from e in db.employee where e.StartDateColumn <= startDT 

Quanto sopra DOVE non funziona:

Dettagli eccezione: System.NotSupportedException: il membro del tipo specificato ‘Data’ non è supportato in LINQ alle entity framework. Sono supportati solo gli inizializzatori, i membri dell’entity framework e le proprietà di navigazione delle entity framework.

Questo dovrebbe funzionare Sei sicuro che non ci sia un’altra parte della query che ha triggersto l’eccezione? Ho diverse istanze di query del modulo

 var query = from e in db.MyTable where e.AsOfDate <= DateTime.Now.Date select e; 

nel mio codice.

Utilizzare le DbFunctions della class per tagliare la porzione di tempo.

 using System.Data.Entity; var bla = (from log in context.Contacts where DbFunctions.TruncateTime(log.ModifiedDate) == DbFunctions.TruncateTime(today.Date) select log).FirstOrDefault(); 

Fonte: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

Potrebbe essere dovuto al fatto che la data nel database è annullabile. Prova questo:

 var EmployeeName = from e in db.employee where e.StartDateColumn.Value <= startDT 

Puoi controllare la condizione come questa

 var nextDay = DateTime.Today.AddDays(1); var query = from e in db.MyTable where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay select e; 

qui otterrai i dati relativi alla data di AsOfDate mentre effettuiamo il check-in tra oggi (00:00:00) e domani (00:00:00) otteniamo il record della data odierna solo in qualsiasi momento ...

Non puoi usare .Date

Se desideri controllare oggi puoi creare un datetime senza tempo

 DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); var e = (from mds in myEntities.Table where mds.CreateDateTime >= myDate select mds).FirstOrDefault(); 

prova questo:

 DateTime dd = DateTime.Parse("08/13/2010 00:00:00"); var data = from n in ContributionEligibilities where n.ModifiedDateTime.Date >= DateTime.Parse("08/13/2010").Date select n; data.Dump("Result") ; 

Sono curioso del messaggio di errore che dice 'Date' , quando passi un 'DateTime' . Potrebbe essere che 'StartDateColumn' è in realtà una 'Date' , piuttosto che un 'DateTime' nel database? Questo potrebbe rovinare il confronto …

utilizzare una variabile locale per memorizzare il valore Date e quindi utilizzare tale variabile nella query:

DateTime today = DateTime.Now.Date; from scheme in context.schemes where scheme.EndDate > today select scheme

Sto usando un LinqDataSource e ho avuto problemi a ottenere la mia query con un confronto di date in esso da eseguire senza errori. La risposta è utilizzare la funzione WhereAddParameters e aggiungere il valore di test come parametro fortemente tipizzato.

Vedere l’esempio qui sotto dove sto facendo corrispondere un groupid e controllando se lo StopDate nel mio record è maggiore o uguale a un timbro Data / Ora di adesso.

Sto usando questo frammento di codice attualmente e funziona come un fascino.

 LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString()) LinqCampaigns.Where = "GroupId = " & myGrp & " && " & "StopDate >= @StopDate" 

Funziona come un fascino ….

. Data non ha funzionato, ma. Ha fatto per me.

 var query = from o in Payments where o.Order.OrderDate.Day != o.PaymentDate.Day orderby o.Order.OrderDate select new { o.Order.OrderID, o.Order.OrderDate, o.PaymentDate, o.Order.FirstName, o.Order.LastName, o.Order.CustomerID }; query.Dump(); 

assicurati di controllare il valore null in questo modo:

  '(from mm in _db.Calls where mm.Professionnal.ID.Equals(proid) && mm.ComposedDate.HasValue && (mm.ComposedDate.Value >= datemin) && (mm.ComposedDate.Value <= date) select mm).ToArray();'