2011-09-06 10 views
8

Sto provando a eseguire il seguente bit di codice, ma il confronto fallisce non consegnando le mie entità che mi aspetto che faccia.Un modo semplice per confrontare le date nell'attributo DateTime usando Entity Framework 4 e le query di Linq

Si sta confrontando 06/09/2011 0:00:00 a 06/09/2011 12:25:00, essendo quest'ultimo il valore del record del mio database. Ecco perché il confronto sta fallendo e non sto ottenendo i record di cui ho bisogno.

Sto solo cercando di confrontare se le date combaciano, non mi interessa il tempo.

DateTime today = DateTime.Now.Date; 
var newAuctionsResults = repo.FindAllAuctions() 
         .Where(a => a.IsActive == true || a.StartTime.Value == today) 
         .ToList(); 

Come è possibile confrontare solo le date?

Se utilizzare la proprietà .Data nella parte .StartTime.Value, ottengo un'eccezione:

Il tipo di utente 'Data' specificato non è supportato in LINQ to Entities. Sono supportati solo gli inizializzatori, i membri dell'entità e le proprietà di navigazione dell'entità .

+0

Forse questa domanda sarà d'aiuto? LINQ | Come posso eseguire il confronto delle date in una query di Linq? http://stackoverflow.com/questions/1088212/linq-how-do-i-forma-date-comparison-in-a-linq-query – Kyle

risposta

16

È possibile utilizzare i singoli membri:

var newAuctionsResults = repo.FindAllAuctions() 
         .Where(a => a.IsActive == true 
            || (a.StartTime.Value.Year == todayYear 
             && a.StartTime.Value.Month == todayMonth 
             && a.StartTime.Value.Day == todayDay)) 
         .ToList(); 

... o utilizzare uno dei the other methods/properties supported in L2E.

+0

Viene utilizzato per uguale operatore. Cosa succede se ho bisogno di controllare più grande e meno di operatore. –

-1

provare

DateTime todayStart = DateTime.Now.Date; 
DateTime todayEnd = DateTime.Now; 
var newAuctionsResults = repo.FindAllAuctions() 
         .Where(a => a.IsActive == true || (a.StartTime.Value >= todayStart && a.StartTime.Value <= todayEnd)) 
         .ToList(); 
11

È inoltre possibile utilizzare EntityFunctions.TruncateTime() sotto il namespace System.Data.Objects

Ex.

db.Orders.Where(i => EntityFunctions.TruncateTime(i.OrderFinishDate) == EntityFunctions.TruncateTime(dtBillDate) && i.Status == "B") 

Funziona come un incanto.

+1

Come si scrivono gli UnitTest? –

+0

Le funzioni di entità ora sono obsolete, utilizzare invece DbFunctions! –

Problemi correlati