Аргументы DbArithmeticExpression должны иметь числовой общий тип

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

// first get today 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(); 

Это выражение Linq генерирует это исключение:

DbArithmeticExpression arguments must have a numeric common type.

Пожалуйста, помогите!

Ответ 1

Арифметика с DateTime не поддерживается в Entity Framework 6 и ранее. Вы должны использовать DbFunctions *. Итак, для первой части вашего утверждения, что-то вроде:

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

Обратите внимание, что метод DiffHours принимает Nullable<DateTime>.

Ядро фреймворка Entity (при использовании с Sql Server, возможно, другие поставщики db) поддерживает функции DateTime AddXxx (например, AddHours). Они переведены в DATEADD в SQL.

* EntityFunctions до версии Entity Framework версии 6.

Ответ 2

Я знаю, что это старый вопрос, но в вашем конкретном случае вместо использования DBFunctions, как было предложено @GertArnold, разве вы не могли бы просто инвертировать операцию переместить арифметику, о которой идет речь, из Lambda?

В конце концов clientDateTime и time24 являются фиксированными значениями, поэтому их разность не требуется пересчитывать на каждой итерации.

Как

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

var clientdtminus24 = clientDateTime - time24;

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

Этот рефактор, как правило, возможен, если вы пытаетесь сравнить хранимое время datetime, сдвинутое по временной отметке с другим дат-временем.