2015-01-09 11 views
6

Attualmente sto cercando di aggiungere un ordine a una query LINQ che ordinerà da un campo datetime in un oggetto EF:Ordina per (crescente | decrescente) in LINQ to SQL Server gestisce DateTime in modo diverso

return this.SortingDirection.Equals("asc", StringComparison.InvariantCultureIgnoreCase) ? entities.OrderBy(e => e.ProcessStartTime) : entities.OrderByDescending(e => e.ProcessStartTime); 

Quando SortingDirection è impostato su desc, funziona correttamente. Ma quando impostato su asc non ottengo record!

Osservando SQL Server Profiler, risulta che gli oggetti DateTime sono stati formattati in modo diverso!

Per DESC:

ORDER BY [Project1].[StartTime] DESC',N'[email protected]__linq__22='2015-01-07 09:00:23',@p__linq__23='2015-01-07 09:00:23',@p__linq__24='2015-01-07 09:05:30',@p__linq__25='2015-01-07 09:05:30' 

e per ASC:

ORDER BY [Project1].[StartTime] ASC',N'[email protected]__linq__22='2015-07-01 09:00:23',@p__linq__23='2015-07-01 09:00:23',@p__linq__24='2015-07-01 09:05:30',@p__linq__25='2015-07-01 09:05:30' 

giorni e mesi sono stati scambiati, causando la query SQL per restituire alcun risultato.

Questo per me suggerisce che il metodo IQueryable.OrderBy() non sta utilizzando il formato locale corretto/formato diverso per OrderByDescending(), potrebbe essere un bug in EF?

C'è qualcosa nella stringa di connessione che potrei aggiungere per far rispettare questo o un altro modo che potrei ordinare in base a queste date?

La mia configurazione:

  • .NET 4.5
  • Entity Framework 5.0.0
  • SQL Server 2012 standard

Molte grazie

+1

Come mai un valore * specifico * datetime, ad es. '2015-01-07', è coinvolto in un ordine di clausola? –

+0

possibile duplicato di [associazione MVC DateTime con formato data errato] (http://stackoverflow.com/questions/528545/mvc-datetime-binding-with-incorrect-date-format) – user2831628

risposta

2

Non mostrare il tuo LINQ domanda, ma due cose vengono in mente immediatamente. Innanzitutto, SQL Server ha le proprie impostazioni di globalizzazione e, in secondo luogo, se le date sono parametrizzate (cosa che linq dovrebbe sempre fare) non dovresti aver bisogno di preoccuparti dei formati delle stringhe di date.

0

Quindi il problema che ho non ha nulla a che fare con SQL o EF, Risulta che il problema è il Mvc. Non avevo impostato la cultura nello Web.Config nella cultura Invariant ('en'). Ciò stava causando la condizione del filtro (in questo caso il ProcessorStartTime) da analizzare come una stringa di data statunitense. NET sembra essere predefinito in en-US se non è impostata alcuna cultura nella configurazione (vedere questo question).

Non l'ho visto fino a quando non ho provato a ordinare il set di risultati. Creiamo un nuovo collegamento MvcHtmlString sul pulsante di ordinamento che includeva le condizioni del filtro per ProcessorStartTime. Questo ha analizzato la stringa della data e invertito i giorni e i mesi. Quando ho cliccato sul link, si ottiene parsesd di nuovo ad un DateTime come è che colava giù per il LINQ, e causando di conseguenza il tipo di restituire alcun risultato (maggiori informazioni sulla gestione data MVC in this question.

La ragione OrderByDescending() stava lavorando è che il pulsante di ordinamento è un alternatore intercettato tra | asc | desc, quindi ha reindirizzato giorni e mesi a come dovrebbero essere!

Per riferimento futuro, assicurarsi di avere questo set nella configurazione web Segnalo come un duplicato poiché non è nuovo per SO. Grazie a tutti per quelli che hanno pubblicato (esp.Cylon, mi ha indirizzato nella giusta direzione ^^)