2012-03-22 1 views
91
TimeSpan time24 = new TimeSpan(24, 0, 0); 
TimeSpan time18 = new TimeSpan(18, 0, 0);  

// first get today's sleeping hours 
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientDateTime - o.ClientDateTimeStamp < time24) && 
      o.ClientDateTimeStamp.TimeOfDay > time18 && 
      clientDateTime.TimeOfDay < time18 && 
      o.UserID == userid).ToList(); 

Questa espressione LINQ genera questa eccezione:argomenti DbArithmeticExpression devono avere un tipo comune numerica

DbArithmeticExpression arguments must have a numeric common type. 

Please Help!

+0

Quali sono i risultati di 'clientDateTime - o.ClientDateTimeStamp'? – shahkalpesh

+0

noramlly che dovrebbe essere un oggetto di TimeSpan, in EF l'eccezione è generata. –

risposta

189

L'aritmetica con DateTime non è supportata in Entity Framework 6 e precedenti. Devi usare DbFunctions *. Così, per la prima parte della sua dichiarazione, qualcosa di simile:

var sleeps = context.Sleeps(o => 
    DbFunctions.DiffHours(o.ClientDateTimeStamp, clientDateTime) < 24); 

Si noti che il metodo DiffHours accetta Nullable<DateTime>.

Entity Framwork nucleo (se utilizzato con SQL Server, forse altri fornitori di db) supporta il DateTime AddXxx funzioni (come AddHours). Sono tradotti in DATEADD in SQL.

* EntityFunctions prima versione di Entity Framework 6.

1

So che questa è una vecchia questione, ma nel tuo caso specifico, invece di utilizzare DBFunctions come suggerito da @GertArnold, non hai potuto invertire l'operazione spostare l'aritmetica in questione dal Lambda?

Dopo tutto clientDateTime e time24 sono valori fissi in modo che la loro differenza non debba essere ricalcolata in ogni iterazione.

come:

TimeSpan time24 = new TimeSpan(24, 0, 0); 
TimeSpan time18 = new TimeSpan(18, 0, 0);  

var clientdtminus24 = clientDateTime - time24; 

// first get today's sleeping hours 
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientdtminus24 < o.ClientDateTimeStamp) && 
      o.ClientDateTimeStamp.TimeOfDay > time18 && 
      clientDateTime.TimeOfDay < time18 && 
      o.UserID == userid).ToList(); 

Questo refactoring di solito è possibile se si sta cercando di confrontare il datetime memorizzato spostato da un timestamp correzione con un altro datetime.