2012-03-22 6 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(); 

Это выражение Linq бросает это исключение:аргументы DbArithmeticExpression должны иметь числовой общий тип

DbArithmeticExpression arguments must have a numeric common type. 

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

+0

Каковы результаты 'clientDateTime - o.ClientDateTimeStamp'? – shahkalpesh

+0

noramlly, который должен быть объектом TimeSpan, в исключении EF. –

ответ

189

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

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

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

Entity Framwork ядро ​​ (при использовании с Sql Server, возможно, другие DB провайдеров) поддерживает DATETIME AddXxx функции (как AddHours). Они переведены в DATEADD в SQL.

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

1

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

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

Как:

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(); 

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

Смежные вопросы