Gli argomenti di DbArithmeticExpression devono avere un tipo comune numerico

TimeSpan time24 = new TimeSpan(24, 0, 0); TimeSpan time18 = new TimeSpan(18, 0, 0); // first get today's sleeping hours List sleeps = context.Sleeps.Where( o => (clientDateTime - o.ClientDateTimeStamp  time18 && clientDateTime.TimeOfDay < time18 && o.UserID == userid).ToList(); 

Questa espressione di Linq genera questa eccezione:

 DbArithmeticExpression arguments must have a numeric common type. 

Per favore aiuto!

L’aritmetica con DateTime non è supportata in Entity Framework 6 e precedenti. Devi usare DbFunctions *. Quindi, per la prima parte della tua dichiarazione, qualcosa come:

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

Si noti che il metodo DiffHours accetta Nullable .

Il nucleo di Entity Framwork (se usato con Sql Server, forse altri provider di db) supporta le funzioni AddXxx (come AddHours ). Sono tradotti in DATEADD in SQL.

* EntityFunctions precedenti a Entity Framework versione 6.

So che questa è una vecchia domanda ma nel tuo caso specifico invece di utilizzare le DBFunctions come suggerito da @GertArnold, non potresti semplicemente invertire l’operazione spostando l’aritmetica in questione dal Lambda?

Dopo tutto, clientDateTime e time24 sono valori time24 , quindi la loro differenza non deve essere ricalcasting in ogni iterazione.

Piace:

 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 sleeps = context.Sleeps.Where( o => (clientdtminus24 < o.ClientDateTimeStamp) && o.ClientDateTimeStamp.TimeOfDay > time18 && clientDateTime.TimeOfDay < time18 && o.UserID == userid).ToList(); 

Questo refactoring è solitamente ansible se si sta tentando di confrontare il datetime memorizzato spostato da un timestamp della correzione con un altro datetime.

In AsEnumerable() , se le prestazioni non sono il vero objective, puoi provare a utilizzare AsEnumerable() . Quindi, sarebbe come

 List sleeps = context.Sleeps.AsEnumerable().Where(.... 

L’aggiunta di AsEnumerable () convertirà la query SQL in quadro e consentirà di eseguire funzioni .NET su di essi. Per maggiori informazioni, controllare qui su AsEnumerable