DbArithmeticExpression arguments must have a numeric common type

ado.net, c#, entity-framework

Solution

Arithmetic with `DateTime` is not supported in Entity Framework 6 and earlier. You have to use DbFunctions*. So, for the first part of your statement, something like:

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

Note that the `DiffHours` method accepts `Nullable<DateTime>`.

Entity Framwork core (when used with Sql Server, maybe other db providers) supports the DateTime `AddXxx` functions (like `AddHours`). They're translated into `DATEADD` in SQL.

*`EntityFunctions` prior to Entity Framework version 6.

Problem

``` 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(); ``` This Linq expression throws this exception: ``` DbArithmeticExpression arguments must have a numeric common type. ``` Please Help!

Original source