Come confrontare solo i componenti della data da DateTime in EF?

Sto avendo due valori di data, uno già memorizzato nel database e l’altro selezionato dall’utente che utilizza DatePicker. Il caso d’uso è per cercare una data particolare dal database.

Il valore precedentemente inserito nel database ha sempre un componente orario di 12:00:00, dove la data inserita dal selezionatore ha una componente temporale diversa.

Sono interessato solo ai componenti della data e vorrei ignorare la componente temporale.

Quali sono i modi per fare questo confronto in C #?

Inoltre, come farlo in LINQ?

AGGIORNAMENTO: su LINQ su quadro, quanto segue funziona correttamente.

e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0 

NOTA: al momento di scrivere questa risposta, la relazione EF non era chiara (che è stata modificata nella domanda dopo che questa è stata scritta). Per un approccio corretto con EF, controllare la risposta Mandeep .


È ansible utilizzare la proprietà DateTime.Date per eseguire un confronto di sola data.

 DateTime a = GetFirstDate(); DateTime b = GetSecondDate(); if (a.Date.Equals(b.Date)) { // the dates are equal } 

Utilizzare la class EntityFunctions per tagliare la porzione di tempo.

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

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

AGGIORNARE

A partire da EF 6.0 e successive EntityFunctions è sostituito da DbFunctions .

Penso che questo potrebbe aiutarti.

Ho fatto un’estensione poiché devo confrontare le date in repository riempiti con dati EF e quindi. Date non era un’opzione in quanto non è implementato nella traduzione di LinqToEntities.

Ecco il codice:

  ///  /// Check if two dates are same ///  /// Type /// date field /// date compared /// bool public Expression> IsSameDate(Expression> valueSelector, DateTime value) { ParameterExpression p = valueSelector.Parameters.Single(); var antes = Expression.GreaterThanOrEqual(valueSelector.Body, Expression.Constant(value.Date, typeof(DateTime))); var despues = Expression.LessThan(valueSelector.Body, Expression.Constant(value.AddDays(1).Date, typeof(DateTime))); Expression body = Expression.And(antes, despues); return Expression.Lambda>(body, p); } 

allora puoi usarlo in questo modo.

  var today = DateTime.Now; var todayPosts = from t in turnos.Where(IsSameDate(t => t.MyDate, today)) select t); 

Se si utilizza la proprietà Date per le quadro DB, si otterrà un’eccezione:

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

Puoi usare qualcosa come questo:

  DateTime date = DateTime.Now.Date; var result = from client in context.clients where client.BirthDate >= date && client.BirthDate < date.AddDays(1) select client; 

Per farlo in LINQ alle quadro, devi usare i metodi supportati :

 var year = someDate.Year; var month = ... var q = from r in Context.Records where Microsoft.VisualBasic.DateAndTime.Year(r.SomeDate) == year && // month and day 

Brutto, ma funziona, ed è fatto sul server DB.

Ecco un modo diverso di farlo, ma è utile solo se SecondDate è una variabile che stai trasmettendo:

 DateTime startDate = SecondDate.Date; DateTime endDate = startDate.AddDays(1).AddTicks(-1); ... e => e.FirstDate.Value >= startDate && e.FirstDate.Value <= endDate 

Penso che dovrebbe funzionare

Puoi anche usare questo:

DbFunctions.DiffDays(date1, date2) == 0

Confronta sempre la proprietà Date di DateTime, invece che l’ora completa.

Quando si effettua la query LINQ, utilizzare date.Date nella query, ad esempio:

 var results = from c in collection where c.Date == myDateTime.Date select c; 

Questo è come lo faccio.

 DateTime date_time_to_compare = DateTime.Now; //Compare only date parts context.YourObject.FirstOrDefault(r => EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare)); 

// Nota per utenti / codificatori Linq

Questo dovrebbe fornire il confronto esatto per verificare se una data rientra nell’intervallo quando si lavora con l’input di un utente: ad esempio, il selezionatore di date:

 ((DateTime)ri.RequestX.DateSatisfied).Date >= startdate.Date && ((DateTime)ri.RequestX.DateSatisfied).Date <= enddate.Date 

dove startdate e enddate sono valori di un selettore di date.

puoi usare il metodo DbFunctions.TruncateTime () per questo.

 e => DbFunctions.TruncateTime(e.FirstDate.Value) == DbFunctions.TruncateTime(SecondDate); 

È ansible l’utente sotto il collegamento per confrontare 2 date senza tempo:

 private bool DateGreaterOrEqual(DateTime dt1, DateTime dt2) { return DateTime.Compare(dt1.Date, dt2.Date) >= 0; } private bool DateLessOrEqual(DateTime dt1, DateTime dt2) { return DateTime.Compare(dt1.Date, dt2.Date) <= 0; } 

la funzione Confronta restituisce 3 valori diversi: -1 0 1 che significa dt1> dt2, dt1 = dt2, dt1

Senza tempo che provare in questo modo:

 TimeSpan ts = new TimeSpan(23, 59, 59); toDate = toDate.Add(ts); List resultLogs = _dbContext.AuditLogs .Where(al => al.Log_Date >= fromDate && al.Log_Date <= toDate) .ToList(); return resultLogs; 

Prova questo … Funziona bene per confrontare le proprietà Date tra due tipi DateTimes:

PS. Si tratta di una soluzione temporanea e una pratica davvero negativa, non dovrebbe mai essere utilizzata quando si sa che il database può portare migliaia di record …

 query = query.ToList() .Where(x => x.FirstDate.Date == SecondDate.Date) .AsQueryable();