2010-11-15 10 views
17

Sto provando a fare un gruppo Linq solo sulla parte data di un campo datetime.LINQ to Entities group-by failure using .date

Questa istruzione linq funziona ma raggruppa per data e ora.

var myQuery = from p in dbContext.Trends 
      group p by p.UpdateDateTime into g 
      select new { k = g.Key, ud = g.Max(p => p.Amount) }; 

Quando eseguo questa dichiarazione al gruppo da solo la data ottengo il seguente errore

var myQuery = from p in dbContext.Trends 
      group p by p.UpdateDateTime.Date into g //Added .Date on this line 
      select new { k = g.Key, ud = g.Max(p => p.Amount) }; 

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à.

Come posso fare un gruppo per la data e non la data e l'ora?

+0

Questo è strano perché lo stesso codice esatto funziona per Linq to SQL! – azamsharp

risposta

32

utilizzare il metodo EntityFunctions.TruncateTime:

var myQuery = from p in dbContext.Trends 
      group p by EntityFunctions.TruncateTime(p.UpdateDateTime) into g 
      select new { k = g.Key, ud = g.Max(p => p.Amount) }; 
+0

Questo funziona. È un po 'più pulito rispetto all'altra soluzione che funziona anche. Grazie! – twamn

+0

Funziona in tutti i casi tranne quando vengono utilizzati diversi fusi orari. Quindi il raggruppamento viene eseguito anche in fusi orari. Qui ho postato una soluzione non valida e vorrei un aiuto per rendere il codice più pulito: [LINQ .NET alle entità raggruppate per data (giorno)] (http://stackoverflow.com/questions/11016703/net-linq-to-entities -group-by-date-day) – Zeezer

+0

Grazie. Lo stavo cercando da giorni. Tu sei l'uomo – Dudipoli

0

Non è possibile utilizzare DateTime.Date in una query Linq-to-Entities. È possibile raggruppare i campi in modo esplicito o creare un campo Date nel database. (Ho avuto lo stesso problema: ho usato un campo Date nel db, mai guardato indietro).

5

Possibile soluzione here che segue il modello:

var q = from i in ABD.Listitem 
    let dt = p.EffectiveDate 
    group i by new { y = dt.Year, m = dt.Month, d = dt.Day} into g 
    select g; 

Così, per la query [testati]:

var myQuery = from p in dbContext.Trends 
     let updateDate = p.UpdateDateTime 
     group p by new { y = updateDate.Year, m = updateDate.Month, d = updateDate.Day} into g 
     select new { k = g.Key, ud = g.Max(p => p.Amount) }; 
+0

Funziona con una piccola mod. "into g" deve essere aggiunto alla fine della terza riga. Grazie! – twamn

+0

Ma direi che la soluzione alla deriva è la migliore se si utilizza EF 4.0 .. Non ero in precedenza consapevole delle utilità di EntityFunctions .. –

Problemi correlati